Javascript 如何对数组中的相同对象求和

Javascript 如何对数组中的相同对象求和,javascript,arrays,sorting,object,Javascript,Arrays,Sorting,Object,如果数组的值相同,则可以求和,如下所示: var COLLECTION = [ { "coords":[1335,2525], "items":[ {id: "boletus",qty: 1}, {id: "lepiota",qty: 3}, {id: "boletus",qty: 2}, {id: "lepiota",qty: 4}, {id: "carbonite",qty: 4}, ], },

如果数组的值相同,则可以求和,如下所示:

var COLLECTION = [
  {
    "coords":[1335,2525],
    "items":[
      {id: "boletus",qty: 1},
      {id: "lepiota",qty: 3},
      {id: "boletus",qty: 2},
      {id: "lepiota",qty: 4},
      {id: "carbonite",qty: 4},
    ],
  },
  {
    "coords":[1532,2889],
    "items":[
      {id: "boletus",qty: 2},
      {id: "lepiota",qty: 6},
      {id: "boletus",qty: 1},
      {id: "lepiota",qty: 4},
      {id: "chamomile",qty: 4},
    ],
  }]
var COLLECTION = [
  {
    "coords":[1335,2525],
    "items":[
      {id: "boletus",qty: 3},
      {id: "lepiota",qty: 7},
      {id: "carbonite",qty: 4},
    ],
  },
  {
    "coords":[1532,2889],
    "items":[
      {id: "boletus",qty: 3},
      {id: "lepiota",qty: 10},
      {id: "chamomile",qty: 4},
    ],
  }]
要返回如下内容:

var COLLECTION = [
  {
    "coords":[1335,2525],
    "items":[
      {id: "boletus",qty: 1},
      {id: "lepiota",qty: 3},
      {id: "boletus",qty: 2},
      {id: "lepiota",qty: 4},
      {id: "carbonite",qty: 4},
    ],
  },
  {
    "coords":[1532,2889],
    "items":[
      {id: "boletus",qty: 2},
      {id: "lepiota",qty: 6},
      {id: "boletus",qty: 1},
      {id: "lepiota",qty: 4},
      {id: "chamomile",qty: 4},
    ],
  }]
var COLLECTION = [
  {
    "coords":[1335,2525],
    "items":[
      {id: "boletus",qty: 3},
      {id: "lepiota",qty: 7},
      {id: "carbonite",qty: 4},
    ],
  },
  {
    "coords":[1532,2889],
    "items":[
      {id: "boletus",qty: 3},
      {id: "lepiota",qty: 10},
      {id: "chamomile",qty: 4},
    ],
  }]
阵列的其他部分不会丢失吗? (手工操作很难,因为我有10000多个重复项,如上面的示例,数组有60万个条目。

您可以使用
map()
创建新数组,并在
reduce()
中按id和数量总和对
对象进行分组

[代码>var数据=<代码>var数据=[{“合作者”的代码>var数据..var数据数据..变异数据数据..变异数据数据..变异数据数据....变异数据.变异数据..数据....数据..数据.数据..数据..数据.数据...数据.数据....数据.......数据..数据.....数据..数据.数据....数据....数据.......数据.....数据...数据.数据.......数据....数据....数据.....数据.......数据.......数据.....数据......数据........数据.....数据......数据....数据 const result=data.map(函数({coords,items}){ 返回{coords,items:Object.values(items.reduce)(函数(r,e){ 如果(!r[e.id])r[e.id]=Object.assign({},e) else r[e.id]。数量+=e.qty 返回r; }, {}))} }) console.log(result)您可以使用
map()
创建新数组,并在
reduce()
中按id和数量总和对
对象进行分组

[代码>var数据=<代码>var数据=[{“合作者”的代码>var数据..var数据数据..变异数据数据..变异数据数据..变异数据数据....变异数据.变异数据..数据....数据..数据.数据..数据..数据.数据...数据.数据....数据.......数据..数据.....数据..数据.数据....数据....数据.......数据.....数据...数据.数据.......数据....数据....数据.....数据.......数据.......数据.....数据......数据........数据.....数据......数据....数据 const result=data.map(函数({coords,items}){ 返回{coords,items:Object.values(items.reduce)(函数(r,e){ 如果(!r[e.id])r[e.id]=Object.assign({},e) else r[e.id]。数量+=e.qty 返回r; }, {}))} })
console.log(结果)您可以使用函数

这种方法对原始数组进行变异

var COLLECTION=[{“coords”:[1335225],“items”:[{id:“boletus”,数量:1},{id:“boletus”,数量:3},{id:“boletus”,数量:2},{id:“lepiota”,数量:4},{id:“carbonite”,数量:4},},{“coords”:[15322889],“items:[{id:“boletus”,数量:2},{id:“lepiota”,数量:6,{id:“boletus”,数量:1},{id:“lepiota”,数量:4},{id:“洋甘菊”,数量:4},],}];
COLLECTION.forEach((o)=>{
o、 项目=对象值(o.items.reduce((a,c)=>{
(a[c.id]| |(a[c.id]={id:c.id,数量:0})).qty+=c.qty;
返回a;
}, {}));
});
console.log(集合);

。作为控制台包装{最大高度:100%!重要;顶部:0;}
您可以使用函数

这种方法对原始数组进行变异

var COLLECTION=[{“coords”:[1335225],“items”:[{id:“boletus”,数量:1},{id:“boletus”,数量:3},{id:“boletus”,数量:2},{id:“lepiota”,数量:4},{id:“carbonite”,数量:4},},{“coords”:[15322889],“items:[{id:“boletus”,数量:2},{id:“lepiota”,数量:6,{id:“boletus”,数量:1},{id:“lepiota”,数量:4},{id:“洋甘菊”,数量:4},],}];
COLLECTION.forEach((o)=>{
o、 项目=对象值(o.items.reduce((a,c)=>{
(a[c.id]| |(a[c.id]={id:c.id,数量:0})).qty+=c.qty;
返回a;
}, {}));
});
console.log(集合);

.as console wrapper{max height:100%!important;top:0;}
您可以利用的强大功能,并通过使用映射函数呈现结果,该函数为
项构建新对象

var集合=[{coords:[13352525],项目:[{id:“boletus”,数量:1},{id:“lepiota”,数量:3},{id:“boletus”,数量:2},{id:“lepiota”,数量:4},{id:“carbonite”,数量:4},},{coords:[15322889],项目:[{id:“boletus”,数量:2},{id:“lepiota”,数量:6},{id:“boletus”,数量:1:“boletus”,数量:4},{“洋甘菊”,数量:4}]};
COLLECTION.forEach(o=>{
var-map=新映射;
o、 items.forEach(({id,qty})=>map.set(id,(map.get(id)| | 0)+qty));
o、 items=Array.from(map,([id,qty])=>({id,qty}));
});
console.log(集合);

.as console wrapper{max height:100%!important;top:0;}
您可以利用的强大功能,并通过使用映射函数呈现结果,该函数为
项构建新对象

var COLLECTION=[{coords:[13352525],条目:[{id:“boletus”,数量:1},{id:“boletus”,数量:3},{id:“boletus”,数量:2},{id:“lepiota”,数量:4},{id:“carbonite”,数量:4},},{coords:[15322889],条目:[{id:“boletus”,数量:2},{id:“lepiota”,数量:6},{id:“boletus”,数量:1:“boletus”,数量:4},{洋甘菊“,数量:4}]}];
COLLECTION.forEach(o=>{
var-map=新映射;
o、 items.forEach(({id,qty})=>map.set(id,(map.get(id)| | 0)+qty));
o、 items=Array.from(map,([id,qty])=>({id,qty}));
});
console.log(集合);

。作为控制台包装器{max height:100%!important;top:0;}
您的结果看起来与预期不同。您的结果看起来与预期不同。