javascript - 循环对象数组并合并它们(如果它们具有相似的键)

标签 javascript arrays for-loop compareobject

我正在尝试迭代一个类似于以下结构的数组,对于具有相同 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/

相关文章:

arrays - 给定字符数组,一次找到第k个非重复字符

c# - 如何将字符串转换为十六进制字节数组?

java - Java 中具有多个条件的迭代器循环

algorithm - Go中几乎增加的序列:如何循环避免索引越界?

javascript - JQuery 数字格式

javascript - 使用 jQuery 计算两个输入表单的值

javascript - 单击表单中的元素时如何停止滚动运动

javascript - 合并数组中具有相同属性值的对象

javascript - Cytoscape.js eles.style 更改立即更新

php - 如何在 PHP 中迭代 JSON 输出并仅选择第二个键 => 值?