javascript - 将数组中的对象合并为一个
问题描述
我有一个对象数组如下:
arr = [
{
totalPrice:{
value:5,
currencyId:0
}
},
{
totalPrice:{
value:1,
currencyId:0
}
},
{
totalPrice:{
value:6,
currencyId:0
}
}
]
如果所有 totalPrice 对象具有相同的 currencyId,我想要做的是获取一个包含价值总和的对象(totalPrice)。
第一步是确定所有的 totalPrice 对象是否具有相同的 currencyId:
var canBeMerged = arr.every(l => l.totalPrice.currencyId === arr[0].totalPrice.currencyId);
然后:
var merged = null;
if(canBeMerged){
var valueSum = 0;
for (var k=0; k<arr.length; k++) {
valueSum += arr[k].totalPrice.value;
}
merged = {value: valueSum, currencyId: arr[0].totalPrice.currencyId}
}
有没有办法以单一方式完成所有这些工作?我认为 reduce 函数可以做到这一点,但我不知道该怎么做。
任何帮助,将不胜感激 :)
解决方案
这使用一个对象来累积每个 的值currencyId
。
let merge = arr => {
d = {};
arr.forEach(a => d[a.totalPrice.currencyId] = (d[a.totalPrice.currencyId] ? d[a.totalPrice.currencyId] : 0) + a.totalPrice.value);
return Object.entries(d).map(([k, i]) => ({ value: i, currencyId: parseInt(k) }));
}
例子:
>> arr = [
{
totalPrice:{
value:5,
currencyId:0
}
},
{
totalPrice:{
value:1,
currencyId:0
}
},
{
totalPrice:{
value:6,
currencyId:0
}
}
]
>> merge(arr)
[{ value:12, currencyId:0 }]
>> arr = [
{
totalPrice:{
value:5,
currencyId:0
}
},
{
totalPrice:{
value:1,
currencyId:1
}
},
{
totalPrice:{
value:6,
currencyId:0
}
}
]
>> merge(arr)
[{ value:11, currencyId:0 }, { value:1, currencyId:1 }]
推荐阅读
- c# - 如何阻止 Azure 每 5 分钟触发一次 Session_Start
- html - 尝试将 [src] 与 url 和变量一起使用
- mongodb - 使用官方 Mongo Go 驱动程序 mongo-go-driver (session.SetMode in mgo) 将一致性规则设置为单调
- php - 如何在 mysqli 查询中使用两个 AND 运算符
- r - 如何从 R 中的两个数据帧中提取三元组?
- ios - UIButton 边框中的生涩渐变
- angular - Angular/NgRx - 在 Guards 中组合 2 个选择器
- python - Python函数从两个不同的函数中获取输入并返回一个连接的字符串
- c# - 我有实体框架 6.2 我正在尝试查找表中具有日期时间类型的所有列
- php - 使用 Solarium php 的建议查询中的 HTTP 错误问题