javascript - 分组依据、不同计数、JavaScript 数组中对象的总计

标签 javascript

这可能是补救措施,但我无法弄清楚。我试过使用 d3 并使用 lodash 来获得有效的解决方案,但没有得到任何结果。

我在 JavaScript 中有一个对象数组。如果 [Selected] 值为 true,我想创建一个按 [Version Name] 分组的对象,其中包含 distinct 区域的计数,以及每个版本的总和。例如对象...

[ 
     { Selcted: false, Version Name: "aaa", Zone: "11111", Value: 5 },
     { Selcted: false, Version Name: "aaa", Zone: "11111", Value: 10 },
     { Selcted: true, Version Name: "aaa", Zone: "11111", Value: 15 },
     { Selcted: true, Version Name: "aaa", Zone: "11111", Value: 20 },
     { Selcted: true, Version Name: "aaa", Zone: "22222", Value: 25 },
     { Selcted: true, Version Name: "bbb", Zone: "22222", Value: 30 },
     { Selcted: true, Version Name: "bbb", Zone: "22222", Value: 35 },
     { Selcted: true, Version Name: "bbb", Zone: "2222", Value: 40 }
]

应该返回结果

[ 
     { Version Name: "aaa", Zone Count: "2", Value Sum: 50 },
     { Version Name: "bbb", Zone Count: "1", Value Sum: 105 },
]

最佳答案

这使用了我最喜欢的 groupBy 函数 :) 一旦你获得了组,你就可以做另一个组来获得区域计数,并进行 reduce 来获得你的总和。

简而言之

const byName = groupBy(input.filter(it => it.Selcted), it => it['Version Name'])

const output = Object.keys(byName).map(name => {
  const byZone = groupBy(byName[name], it => it.Zone)
  const sum = byName[name].reduce((acc, it) => acc + it.Value, 0)
  return {
    'Version Name': name,
    ZoneCount: Object.keys(byZone).length,
    ValueSum: sum
  }
})

不要忘记,您需要在“版本名称”周围加上引号才能将其用作 key 。

这是您的数据集的工作示例。

function groupBy(a, keyFunction) {
  const groups = {};
  a.forEach(function(el) {
    const key = keyFunction(el);
    if (key in groups === false) {
      groups[key] = [];
    }
    groups[key].push(el);
  });
  return groups;
}

const input = [{
    Selcted: false,
    'Version Name': "aaa",
    Zone: "11111",
    Value: 5
  },
  {
    Selcted: false,
    'Version Name': "aaa",
    Zone: "11111",
    Value: 10
  },
  {
    Selcted: true,
    'Version Name': "aaa",
    Zone: "11111",
    Value: 15
  },
  {
    Selcted: true,
    'Version Name': "aaa",
    Zone: "11111",
    Value: 20
  },
  {
    Selcted: true,
    'Version Name': "aaa",
    Zone: "22222",
    Value: 25
  },
  {
    Selcted: true,
    'Version Name': "bbb",
    Zone: "22222",
    Value: 30
  },
  {
    Selcted: true,
    'Version Name': "bbb",
    Zone: "22222",
    Value: 35
  },
  {
    Selcted: true,
    'Version Name': "bbb",
    Zone: "2222",
    Value: 40
  }
]

const byName = groupBy(input.filter(it => it.Selcted), it => it['Version Name'])

const output = Object.keys(byName).map(name => {
  const byZone = groupBy(byName[name], it => it.Zone)
  const sum = byName[name].reduce((acc, it) => acc + it.Value, 0)
  return {
    'Version Name': name,
    ZoneCount: Object.keys(byZone).length,
    ValueSum: sum
  }
})


console.log(output)

关于javascript - 分组依据、不同计数、JavaScript 数组中对象的总计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51971373/

相关文章:

javascript - 正则表达式 Javascript 查找/替换

PHP 和 jQuery 绘制数字动画

javascript - 从 Javascript 获取 url 参数字符串

javascript - 如何获得具有固定总和和大小的随机数列表

javascript - 在 NodeJS 中使用 mongo+mongoose 交换值的函数

javascript - 请求响应后正文中出现奇怪的字符

javascript - 当 Firebug 运行时,jQuery 在 Firefox 中工作,当 Firebug 未运行时,jQuery 不起作用

javascript - 在动态添加的复选框上启用 Switchery

javascript - onBlur() 无法正常工作

javascript - 不同GPoint之间的算法中点