I have an array like so which i am trying to merge so any object that has the name property the same will after the merge contain a list of merged objects
va
Using reduce
:
var merged = array.reduce(function(list, obj) {
var found = false;
for (var i = 0; i < list.length; i++) {
if (list[i].name == obj.name) {
list[i].myList = list[i].myList.concat(obj.myList);
found = true;
break;
}
}
if (!found) {
list.push(obj);
}
return list;
}, []);
Another approach using Lodash
with just chain and reduce
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);
Firstly you could remove the duplicate entries and organize the objects inside the myList
array. Then, return an array of objects with specified keys, based on the ordered object from the first step.
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);