Javascript 在对象数组上循环,如果它们具有相似的键,则将它们组合起来

Javascript 在对象数组上循环,如果它们具有相似的键,则将它们组合起来,javascript,arrays,for-loop,compareobject,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, n

我试图迭代一个类似于下面结构的数组,对于每个具有相同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 2这样的单个id对象。

另一种方法是使用函数
reduce

var数组=[{id:1,名称:“橙色”},{id:1,名称:“蓝色”},{id:1,名称:“绿色”},{id:2,名称:“蓝色”},{id:3,名称:“橙色”},{id:3,名称:“蓝色”}]
var result=Object.values(array.reduce)(a,c)=>{
(a[c.id]| |(a[c.id]={id:c.id,nameList:[]})).nameList.push(c.name);
返回a;
}, {}));
控制台日志(结果)

。作为控制台包装{max height:100%!important;top:0;}
另一种选择是使用函数
reduce

var数组=[{id:1,名称:“橙色”},{id:1,名称:“蓝色”},{id:1,名称:“绿色”},{id:2,名称:“蓝色”},{id:3,名称:“橙色”},{id:3,名称:“蓝色”}]
var result=Object.values(array.reduce)(a,c)=>{
(a[c.id]| |(a[c.id]={id:c.id,nameList:[]})).nameList.push(c.name);
返回a;
}, {}));
控制台日志(结果)

.as console wrapper{max height:100%!important;top:0;}
如果不需要在适当的位置执行此操作,只需创建另一个对象并直接将其放入即可

var map = {}
for (var obj in array) {
  var id = obj.id;
  var name = obj.name;
  if (!map[id]) {
    map[id] = [];
  }
  map[id].push(name); 
}
然后在地图上迭代以建立结果:

var result = [];
Object.keys(map).forEach(function(key) {
  result.push[key, map[key]];
}

如果您不需要在适当的位置执行此操作,您可以创建另一个对象并直接将其放入其中

var map = {}
for (var obj in array) {
  var id = obj.id;
  var name = obj.name;
  if (!map[id]) {
    map[id] = [];
  }
  map[id].push(name); 
}
然后在地图上迭代以建立结果:

var result = [];
Object.keys(map).forEach(function(key) {
  result.push[key, map[key]];
}

由于排序的项目,您可以检查结果数组中的最后一个项目,如果与实际项目不同,则生成一个新的结果对象。稍后按
name

var数组=[{id:1,名称:“橙色”},{id:1,名称:“蓝色”},{id:1,名称:“绿色”},{id:2,名称:“蓝色”},{id:3,名称:“橙色”},{id:3,名称:“蓝色”},
grouped=array.reduce(函数(r,{id,name}){
如果(!r.length | | r[r.length-1].id!==id){
r、 推送({id,名称列表:[]});
}
r[r.length-1].namelist.push(name);
返回r;
}, []);
控制台日志(分组)

.as console wrapper{max height:100%!important;top:0;}
由于排序的项目,您可以检查结果数组中的最后一个项目,如果与实际项目不同,则生成一个新的结果对象。稍后按
name

var数组=[{id:1,名称:“橙色”},{id:1,名称:“蓝色”},{id:1,名称:“绿色”},{id:2,名称:“蓝色”},{id:3,名称:“橙色”},{id:3,名称:“蓝色”},
grouped=array.reduce(函数(r,{id,name}){
如果(!r.length | | r[r.length-1].id!==id){
r、 推送({id,名称列表:[]});
}
r[r.length-1].namelist.push(name);
返回r;
}, []);
控制台日志(分组)
。作为控制台包装{最大高度:100%!重要;顶部:0;}