Javascript 减少和合并对象集合的最佳方法是什么

Javascript 减少和合并对象集合的最佳方法是什么,javascript,arrays,object,collections,Javascript,Arrays,Object,Collections,因此,本周我在试图解决看似简单的问题时陷入了两难境地,但我错了 示例代码: let arr = [ { id: 'ae0123', cost: 100.00, orders: 5 }, { id: 'ae0123', cost: 50.00, orders: 5 }, { id: 'ae4321', cost: 75.00, orders: 1 } ] 因此,问题在于,如果值的唯一标识符匹配,则能够映射整个数组并合并/求和这些值 有什么建议吗 最终结果如下所示: [ {id:'ae

因此,本周我在试图解决看似简单的问题时陷入了两难境地,但我错了

示例代码:

let arr = [
  { id: 'ae0123', cost: 100.00, orders: 5 },
  { id: 'ae0123', cost: 50.00, orders: 5 },
  { id: 'ae4321', cost: 75.00, orders: 1 }
]
因此,问题在于,如果值的唯一标识符匹配,则能够映射整个数组并合并/求和这些值

有什么建议吗

最终结果如下所示:

[
{id:'ae0123',成本:150.00,订单:10},
{id:'ae4321',成本:75.00,订单:1}
]
现在,当然,真正的应用程序不会有静态类型的ID,但是它们被写入了这个示例中。所以请考虑一下


提前谢谢

您可以使用
映射
id
存储对象,如果对象中已经存在,则添加值:

让arr=[
{id:'ae0123',成本:100.00,订单:5},
{id:'ae0123',成本:50.00,订单:5},
{id:'ae4321',成本:75.00,订单:1}
];
设map={};
for(设i=0;i创建一个新数组

对于每个项目,如果已经存在,则添加成本和订单,否则将其添加到数组中

让arr=[
{id:'ae0123',成本:100.00,订单:5},
{id:'ae0123',成本:50.00,订单:5},
{id:'ae4321',成本:75.00,订单:1}
]
让newArr=[]
arr.forEach(项目=>{
让existingItem=newArr.find(x=>x.id==item.id);
如果(现有项!=未定义){
现有item.cost+=item.cost;
existingItem.orders+=item.orders;
}否则{
新到货推送(项目);
}
});
控制台日志(newArr)
让arr=[
{id:'ae0123',成本:100.00,订单:5},
{id:'ae0123',成本:50.00,订单:5},
{id:'ae4321',成本:75.00,订单:1}
]
设obj={};
arr.forEach(项目=>{
如果(对象[项目id]){
obj[item.id]。成本+=item.cost;
obj[item.id].orders+=item.orders;
}
否则{
obj[item.id]=物料;
}
});
常量mappedArr=Object.keys(obj.map)(key=>obj[key]);

log(mappedArr)
您可以获取用于分组的对象和用于添加所需属性的数组

let数组=[{id:'ae0123',成本:100.00,订单:5},{id:'ae0123',成本:50.00,订单:5},{id:'ae4321',成本:75.00,订单:1}],
结果=对象.values(数组.reduce((r,o)=>{
if(r[o.id]){
forEach(k=>r[o.id][k]+=o[k]);
}否则{
r[o.id]={…o};
}
返回r;
}, {}));
控制台日志(结果)

。作为控制台包装器{max height:100%!important;top:0;}
我会使用数组对象的reduce方法,上面提到的使用文本对象的解决方案也可以,但我认为在这种情况下,reduce会使代码更具可读性和优雅:

const arr = [
  { id: 'ae0123', cost: 100.00, orders: 5 },
  { id: 'ae0123', cost: 50.00, orders: 5 },
  { id: 'ae4321', cost: 75.00, orders: 1 }
];

const newArr = arr.reduce((acc, obj) => {
  if (!acc[obj.id]) {
    acc[obj.id] = obj;
  } else {
    acc[obj.id].cost += obj.cost;
    acc[obj.id].orders += obj.orders;
  }
  
  return acc;
}, {});

console.log( Object.values(newArr) );

也许这就是你想要的

让arr=[
{id:'ae0123',成本:100.00,订单:5},
{id:'ae0123',成本:50.00,订单:5},
{id:'ae4321',成本:75.00,订单:1}
]
让uniq=[]
arr.map(x=>{
如果(!uniq.包括(x.id))uniq=[…uniq,x.id]
})
uniq=uniq.map(x=>{
let filtered=arr.filter(y=>y.id==x)
设res=filtered.shift()
用于(已过滤的常数z){
const{cost,orders}=z
资源成本+=成本
res.orders+=订单
}
返回res
})
console.log(uniq)

告诉我它是否有效,这将创建一个包含对象的新数组。

有很多奇妙的答案,但这一答案很强大,因为它能够添加一组项目,并且允许在字段数量上有更大的灵活性。非常感谢你!
let newArr = []

arr.forEach((el, ind) => { 
    let uniqueId = el.id;
    let obj = el;
    let multiple = false;
    arr.forEach((e, i) => {
        if(e.id == uniqueId && ind != i ) {
            el.cost += e.cost;
            el.orders += e.orders;
             multiple = true;
             arr.splice(i,1);
             newArr.push(el)
        }
    });

    if(!multiple){
        newArr.push(obj);
    }

});