根据属性合并数组中的对象

时间:2017-04-07 14:58:12

标签: javascript

我有一个像这样的数组,我试图合并所以任何具有name属性相同的对象将在合并后包含合并对象列表

var array = [ 
    {name: "One",
     myList: [Object1, Object2]
    },
    {name: "Two",
     myList: [Object3, Object4]
     },
     {name: "One",
     myList: [Object5, Object6]
     }
]

如何合并两个'One'对象,以便我得到类似

的内容
var array = [ 
    {name: "One",
     myList: [Object1, Object2, Object5, Object6]
    },
    {name: "Two",
     myList: [Object3, Object4]
     }
]

希望在vanilla javascript中执行此操作

3 个答案:

答案 0 :(得分:1)

使用.Write("<td colspan=""2"" class=""filterback"">") '.write("<div style=""position:relative;left:150px; display:none;"" id=div_Edit" & g_lngRowCount & ">") .Write("<table cellspacing=""2px"" cellpadding=""2px"" width=""100%"" border=""0"">")

reduce

答案 1 :(得分:1)

首先,您可以删除重复的条目并组织myList数组中的对象。然后,根据第一步中的有序对象,返回具有指定键的对象数组。

var array = [{name:"One",myList:['Object1','Object2']},{name:"Two",myList:['Object3','Object4']},{name:"One",myList:['Object5','Object6']}], obj = {};

array.forEach(function(v) {
  obj[v.name] = (obj[v.name] || []).concat(v.myList)
});

var arr = Object.keys(obj).reduce(function(s,a) {
  s.push({name: a, myList: obj[a]});
  return s;
}, []);

console.log(arr);

答案 2 :(得分:0)

使用仅chainreduce

Lodash的另一种方法
var array = [
    { name: "One", myList: ["Object1", "Object2"] },
    { name: "Two", myList: ["Object3", "Object4"] },
    { name: "One", myList: ["Object5", "Object6"] }
  ];

  const newArray = _.chain(array)
    .reduce((acc, currentValue) => {
      acc[currentValue.name] = (acc[currentValue.name] || []).concat(
        currentValue.myList
      );
      return acc;
    }, {})
    .reduce((acc, currentValue, key) => {
      acc.push({ name: key, myList: currentValue }); 
      return acc;
    }, [])
    .value();

  console.log(newArray);