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);
}
});