首页 > 解决方案 > 如果两个或多个键值相同,如何对字典列表中的元素求和

问题描述

我有以下字典数组:

[{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 中实现这一点?

标签: javascriptarraysdictionary

解决方案


您可以使用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()];

推荐阅读