重组具有相同对象属性值的数组

时间:2020-02-13 12:46:57

标签: javascript arrays typescript object

我有一个对象数组,如下所示:

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 :(得分:0)

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/

基本策略是跟踪输出数组,这将是结果。浏览每个项目时,请检查该项目的标签是否已添加到输出中。如果是这样,您只需添加当前项目的内容。如果还没有(这是第一次),则将一个全新的条目添加到输出中(包括当前项目的内容)。

答案 1 :(得分:0)

如果尚未添加项目,则可以使用Array#reduce进行添加;如果已经存在,则可以对其进行编辑。

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;
}, {})));

答案 2 :(得分:0)

您可以按如下方式使用功能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);

相关问题