我有这样的JSON:

[
  {
     platformId: 1,
     payout: 15,
     numOfPeople: 4
  },
  {
     platformId: 1,
     payout: 12,
     numOfPeople: 3

  },
  {
     platformId: 2,
     payout: 6,
     numOfPeople: 5

  },
  {
     platformId: 2,
     payout: 10,
     numOfPeople: 1
  },

]

我想按platformIdpayoutnumOfPeople的总和对其进行分组。

即结果,我想要这样的JSON:
[
  "1": {
     payout: 27,
     numOfPeople: 7
   },

  "2": {
     payout: 16,
     numOfPeople: 6
  }
]

我尝试使用underscore.js_.groupBy方法,它可以很好地分组,但是如何获得对象属性值的SUM,如我上面演示的那样?

最佳答案

您可以在没有下划线的情况下执行此操作:

var result = data.reduce(function(acc, x) {
  var id = acc[x.platformId]
  if (id) {
    id.payout += x.payout
    id.numOfPeople += x.numOfPeople
  } else {
    acc[x.platformId] = x
    delete x.platformId
  }
  return acc
},{})

但是,为什么要带有数字键的对象呢?您可以将其转换回集合:
var toCollection = function(obj) {
  return Object.keys(obj)
    .sort(function(x, y){return +x - +y})
    .map(function(k){return obj[k]})
}

toCollection(result)

请注意,对象是突变的,因此,如果要保留原始数据,可以先克隆它们。

10-06 04:36