繁体   English   中英

select 数据来自两个不同的对象 arrays 以创建新的对象数组

[英]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 之间不匹配的情况下,如何仅显示匹配的outputNameoutputName的空字符串?

编辑 -当前的 output 看起来像这样: 在此处输入图像描述

使用.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是:

rest 参数语法允许我们将不定数量的 arguments 表示为一个数组。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM