我正在尝试迭代一个类似于以下结构的数组,对于具有相同 id 的每个对象,我希望它们组合成一个对象,但具有与该 id 关联的所有“名称”的数组。我的数组是按 id 预先排序的,我不能使用 JQuery,只能使用 vanilla JS。
转换此:
var array = [
{id=1, name = "Orange"},
{id=1, name = "Blue"},
{id=1, name = "Green"},
{id=2, name = "Blue"},
{id=3, name = "Orange"},
{id=3, name = "Blue"}
]
对此:
var newArray = [
{id=1, nameList = [Orange, Blue, Green]},
{id=2, nameList = [Blue]},
{id=3, namelist = [Orange, Blue]}
]
我试图通过将第一个对象与数组中的下一个对象进行比较,然后将第一个对象设置为第二个对象来执行类似的操作,但由于“secondObject”实际上不是数组中的下一个对象而卡住了大批。
for (var i in array) {
firstObject = array[i];
secondObject = array[i + 1];
if (firstObject.id === secondObject.id) {
firstObject['nameList'] = [firstObject.name + ',' + secondObject.name]
} else {
continue;
}
firstObject = secondObject;
}
我必须使用几千个 id 来完成此操作,并且大多数 id 都使用不同的名称重复,但也有一些单个 id 对象,例如 id 2。
最佳答案
另一种方法是使用函数reduce
var array = [ {id:1, name : "Orange"}, {id:1, name : "Blue"}, {id:1, name : "Green"}, {id:2, name : "Blue"}, {id:3, name : "Orange"}, {id:3, name : "Blue"}]
var result = Object.values(array.reduce((a, c) => {
(a[c.id] || (a[c.id] = {id: c.id, nameList: []})).nameList.push(c.name);
return a;
}, {}));
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
关于javascript - 循环对象数组并合并它们(如果它们具有相似的键),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49414589/