[英]select data from two different arrays of objects to create a new array of objects
我有以下 arrays 对象:
const formulas =
[
{ "formulaID": "1", "versionID": 1, "formulaClass": 3, "formulaType": "34", "outputName": "Chocolate Milk 2%" },
{ "formulaID": "4", "versionID": 1, "formulaClass": 3, "formulaType": "17", "outputName": "Hazelnut Creamer" },
{ "formulaID": "6", "versionID": 1, "formulaClass": 3, "formulaType": "23", "outputName": "White Milk 2%" }
];
const yields =
[
{ "formulaID": "4", "versionID": 1, "yieldFactor": 0.93 },
{ "formulaID": "4", "versionID": 2, "yieldFactor": 0.98 },
{ "formulaID": "6", "versionID": 1, "yieldFactor": 0.95 },
{ "formulaID": "7", "versionID": 1, "yieldFactor": 0.85 }
];
并尝试以编程方式创建此 output:
const result =
[
{ "formulaID": "7", "versionID": 1, "yieldFactor": 0.85, "outputName": "" },
{ "formulaID": "4", "versionID": 1, "yieldFactor": 0.93, "outputName": "Hazelnut Creamer" },
{ "formulaID": "4", "versionID": 2, "yieldFactor": 0.98, "outputName": "" },
{ "formulaID": "6", "versionID": 1, "yieldFactor": 0.95, "outputName": "White Milk 2%" }
];
在这篇文章的帮助下,我编写了以下代码:
const result = yields.map(yld => ({
formulaID: yld.formulaID,
versionID: yld.versionID,
yieldFactor: yld.yieldFactor,
outputName: formulas.filter(f => (f.formulaID + '-' + f.versionID).includes(yld.formulaID + '-' + yld.versionID))
}));
console.log(result);
它接近预期的结果,但我不确定如何仅隔离outputName
。 在其当前的 state 中,它提供了找到匹配项的整个数组。 在源数据的原始 arrays 之间不匹配的情况下,如何仅显示匹配的outputName
和outputName
的空字符串?
使用.filter
将始终返回满足您条件的公式数组,因此您需要先检查它是否给出了结果,然后仅从其结果中检索.outputName
。
可能是这样的:
const result = yields.map(yld => {
const targetFormulas = formulas.filter(f => (f.formulaID + '-' + f.versionID).includes(yld.formulaID + '-' + yld.versionID));
const outputName = targetFormulas.length ? targetFormulas.map(f => f.outputName).join(',') : ''
return {
formulaID: yld.formulaID,
versionID: yld.versionID,
yieldFactor: yld.yieldFactor,
outputName
}
});
如果有超过 1 个,我使用.join(',')
返回以逗号分隔的 outputNames。
如果您确定只会返回 1,则可以执行targetFormulas.map(f => f.outputName)[0]
这将返回以下结果
[
{
"formulaID":"4",
"versionID":1,
"yieldFactor":0.93,
"outputName":"Hazelnut Creamer"
},
{
"formulaID":"4",
"versionID":2,
"yieldFactor":0.98,
"outputName":""
},
{
"formulaID":"6",
"versionID":1,
"yieldFactor":0.95,
"outputName":"White Milk 2%"
},
{
"formulaID":"7",
"versionID":1,
"yieldFactor":0.85,
"outputName":""
}
]
尝试对Map
集合使用reduce
方法以在映射元素时具有O(1)
:
const uniqueUtems = new Map(formulas.map(s=>[s.formulaID, s.outputName]));
const result = yields.reduce((a, {formulaID, ...rest}) => {
a.push({ formulaID , outputName: uniqueUtems.get(formulaID) || '', ...rest });
if (uniqueUtems.has(formulaID))
uniqueUtems.delete(formulaID)
return a;
}, []);
console.log(result);
一个例子:
const formulas = [ { "formulaID": "1", "versionID": 1, "formulaClass": 3, "formulaType": "34", "outputName": "Chocolate Milk 2%" }, { "formulaID": "4", "versionID": 1, "formulaClass": 3, "formulaType": "17", "outputName": "Hazelnut Creamer" }, { "formulaID": "6", "versionID": 1, "formulaClass": 3, "formulaType": "23", "outputName": "White Milk 2%" } ]; const yields = [ { "formulaID": "4", "versionID": 1, "yieldFactor": 0.93 }, { "formulaID": "4", "versionID": 2, "yieldFactor": 0.98 }, { "formulaID": "6", "versionID": 1, "yieldFactor": 0.95 }, { "formulaID": "7", "versionID": 1, "yieldFactor": 0.85 } ]; const uniqueUtems = new Map(formulas.map(s=>[s.formulaID, s.outputName])); const result = yields.reduce((a, {formulaID, ...rest}) => { a.push({ formulaID, outputName: uniqueUtems.get(formulaID) || '', ...rest }); if (uniqueUtems.has(formulaID)) uniqueUtems.delete(formulaID) return a; }, []); console.log(result);
rest 参数语法允许我们将不定数量的 arguments 表示为一个数组。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.