Реструктуризация массива с такими же значениями свойств объекта - PullRequest
0 голосов
/ 13 февраля 2020

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

const array = [{label: "Color", content: "red"},{label: "Color", content: "blue"},{label: "Brand", content: "HI6"},{label: "Brand", content: "Zina"},{label: "Year", content: "2020"}];

Я хочу реструктурировать его, чтобы он выглядел так:

const array = [{label: "Color", content: ["red","blue"]},{label: "Brand", content: ["HI6", "Zina"]},{label: "Year", content: "2020"}];

Есть идеи?

Ответы [ 3 ]

0 голосов
/ 13 февраля 2020

Вы можете использовать Массив # уменьшить , чтобы добавить элемент, если он еще не был добавлен, или отредактировать его, если он уже существует.

т.е.

const array = [{
  label: "Color",
  content: "red"
}, {
  label: "Color",
  content: "blue"
}, {
  label: "Brand",
  content: "HI6"
}, {
  label: "Brand",
  content: "Zina"
}, {
  label: "Year",
  content: "2020"
}];

console.log(Object.values(array.reduce(function(result, item) {
  if (item.label in result) result[item.label].content.push(item.content);
  else result[item.label] = {
    label: item.label,
    content: [item.content]
  };
  return result;
}, {})));
0 голосов
/ 13 февраля 2020

Вы можете использовать функцию reduce вместе с функцией Object.values следующим образом:

По сути, функция reduce группирует объекты по label, а функция Object.values возвращает сгруппированные объекты в виде массива.

const array = [{label: "Color", content: "red"},{label: "Color", content: "blue"},{label: "Brand", content: "HI6"},{label: "Brand", content: "Zina"},{label: "Year", content: "2020"}],
      result = Object.values(array.reduce((r, {label, content}) => {
        (r[label] || (r[label] = {label, content: []})).content.push(content);
        return r;
      }, {}));

console.log(result);
0 голосов
/ 13 февраля 2020
const array = [{label: "Color", content: "red"},{label: "Color", content: "blue"},{label: "Brand", content: "HI6"},{label: "Brand", content: "Zina"},{label: "Year", content: "2020"}];

const mergeProperties = array => {
  const output = [];
  array.forEach( item => {
    if(!item.hasOwnProperty('label') || !item.hasOwnProperty('content')){
        return;
    }
    const alreadyExisting = output.find( outputItem => outputItem.label === item.label );
    if(alreadyExisting){
        alreadyExisting.content.push(item.content);
    }else{
        output.push({
           label: item.label,
           content: [item.content]
        })
    }
  })
  return output;
}

console.log(mergeProperties(array));

https://jsfiddle.net/fg1qjc03/

Основная стратегия c заключается в отслеживании выходного массива, который будет результатом. Когда вы go просматриваете каждый элемент, вы проверяете, была ли метка этого элемента уже добавлена ​​в вывод. Если это так, вы просто добавляете содержимое текущего элемента. Если это не так (это первый раз), вы добавляете в вывод новую запись (включая содержимое текущего элемента).

...