javascript - 如果两个或多个键值相同,如何对字典列表中的元素求和
问题描述
我有以下字典数组:
[{name:'g1', variant:'v1', count:1},{name:'g2', variant:'v1', count:2}, {name:'g1', variant:'v1', count:2}, {name:'g2', variant:'v1', count:2}]
我想在给定数组的情况下创建一个新的字典列表
['name', 'variant']
,这样,如果两个字典对于数组中给定的键具有相同的值,则相应的计数将按如下方式相加:
[{name:'g1', variant:'v1', count:3},{name:'g2', variant:'v1', count:4}]
如何在 Javascript 中实现这一点?
解决方案
您可以使用reduce
方法分组,然后 sum count
:
const result = arr.reduce((a, {name, variant, count}) => {
a[name] = a[name] || {name, variant, count: 0};
a[name].count += count;
return a;
}, {})
一个例子:
let arr = [
{name:'g1', variant:'v1', count:1},
{name:'g2', variant:'v1', count:2},
{name:'g1', variant:'v1', count:2},
{name:'g2', variant:'v1', count:2}
];
const result = arr.reduce((a, {name, variant, count}) => {
a[name] = a[name] || {name, variant, count: 0};
a[name].count += count;
return a;
}, {})
console.log(Object.values(result))
更新:
如果您想按多个属性(例如name
和)进行分组variant
,则可以使用:
const result = [...arr.reduce((r, o) => {
const key = o.name + '-' + o.variant;
const item = r.get(key) || Object.assign({}, o, {
count: 0
});
item.count += +o.count;
return r.set(key, item);
}, new Map).values()];
一个例子:
let arr = [
{name:'g1', variant:'v1', count:1},
{name:'g2', variant:'v1', count:2},
{name:'g1', variant:'v1', count:2},
{name:'g2', variant:'v1', count:2}
];
const result = [...arr.reduce((r, o) => {
const key = o.name + '-' + o.variant;
const item = r.get(key) || Object.assign({}, o, {
count: 0
});
item.count += +o.count;
return r.set(key, item);
}, new Map).values()];
console.log(result);
没有硬编码键:
let firstKey = 'name', secondKey = 'variant', thirdKey = 'count';
const result = [...arr.reduce((r, o) => {
const key = o[firstKey] + '-' + o[secondKey];
const item = r.get(key) || Object.assign({}, o, {
[thirdKey]: 0
});
item[thirdKey] += +o[thirdKey];
return r.set(key, item);
}, new Map).values()];
推荐阅读
- php - 如何解决 CakePHP 警告消息“无法将类 Laminas\Diactoros\UploadedFile 的对象转换为字符串”?
- laravel - Laravel:为什么我的数据库中的“通知”数据没有显示出来?
- python - 当值用逗号分隔时过滤列的第一个值
- awk - 如何通过保留下一行将下一行合并到当前行
- javascript - 将 IF 条件应用于 HTML 表中的每个元素
- discord.py - discord.py 通过命令发送消息,在设定的时间后计算有多少人“投票”了反应(普通表情符号)
- c# - 将字符串输入 PdfFormField 删除或替换为按钮,以便我可以使用 iText 7 Core c# 添加图像
- javascript - 如何从 Firestore 集合中的文档中获取数据?
- python - pygame 显示在初始数组绘制后不更新
- java - iText7 读取交叉引用表时出错。表将被重建。此外部参照小节中的文件位置 {0} 交叉引用条目