выберите данные из двух разных массивов объектов, чтобы создать новый массив объектов - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть следующие массивы объектов:

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 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. В своем текущем состоянии он дает весь массив, где найдено совпадение. Как отобразить только outputName для совпадений и пустую строку для outputName, где нет совпадения между исходными массивами исходных данных?

Правка - Текущий вывод выглядит как это: enter image description here

Ответы [ 2 ]

0 голосов
/ 29 апреля 2020

Попробуйте использовать метод reduce с коллекцией Map, чтобы иметь 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 позволяет нам представлять неопределенное количество аргументов в виде массив.

0 голосов
/ 29 апреля 2020

Использование .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
  }
});

Я использовал .join(',') для возврата outputNames, разделенных запятой, если их больше 1.
Если вы уверен, что будет возвращен только 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":""
   }
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...