如何按多个属性和总和组对数组项进行分组?

时间:2019-01-12 23:44:51

标签: typescript lodash

使用下划线,我已经成功实现了将对象按多个属性进行分组并对这些组进行求和的逻辑,但是我还没有找到用lodash进行处理的方法。

代码如下:

Collection {#254 ▼
  #items: array:3 [▼
    "User2" => Collection {#255 ▼
      #items: array:2 [▼
        1 => 13.0
      ]
    }
    "User1" => Collection {#253 ▼
      #items: array:1 [▼
        3 => 12.0
      ]
    }
    "User2" => Collection {#255 ▼
      #items: array:2 [▼
        3 => 11.0
      ]
    }
  ]
}

这些是示例值:

let test = _.chain(response.counterValues)
  .flatten()
  .groupBy(response.counterValues, (item) => {
      return item.duration + '#' + item.timeFrom + '#' + item.timeTo + '#' + item.objectClass;
  })
  .mapValues((value, key) => {
    let sum = _.reduce(value, (memo, val) => {return memo + val.count}, 0);
    let keyItems = key.split('#');
    let duration = keyItems[0];
    let timeFrom = keyItems[1];
    let timeTo = keyItems[2];
    let objectClass = keyItems[3];
    return {duration: duration, timeFrom: timeFrom, timeTo: timeTo, objectClass: objectClass, count: sum};
  }).value();
console.log(test);

对于这些对象,我想得到以下结果:

0: {duration: "h", timeFrom: "1547323200000", timeTo: "1547326800000", objectClass: "car", count: 1}
1: {duration: "h", timeFrom: "1547323200000", timeTo: "1547326800000", objectClass: "car", count: 3}
2: {duration: "h", timeFrom: "1547323200000", timeTo: "1547326800000", objectClass: "car", count: 1}
3: {duration: "h", timeFrom: "1547323200000", timeTo: "1547326800000", objectClass: "car", count: 1}
4: {duration: "h", timeFrom: "1547323200000", timeTo: "1547326800000", objectClass: "car", count: 3}
5: {duration: "h", timeFrom: "1547323200000", timeTo: "1547326800000", objectClass: "car", count: 2}
6: {duration: "h", timeFrom: "1547323200000", timeTo: "1547326800000", objectClass: "car", count: 1}
7: {duration: "h", timeFrom: "1547323200000", timeTo: "1547326800000", objectClass: "car", count: 2}
8: {duration: "h", timeFrom: "1547323200000", timeTo: "1547326800000", objectClass: "car", count: 4}
9: {duration: "h", timeFrom: "1547323200000", timeTo: "1547326800000", objectClass: "car", count: 1}
10: {duration: "h", timeFrom: "1547323200000", timeTo: "1547326800000", objectClass: "car", count: 2}
11: {duration: "h", timeFrom: "1547323200000", timeTo: "1547326800000", objectClass: "car", count: 2}
12: {duration: "h", timeFrom: "1547323200000", timeTo: "1547326800000", objectClass: "car", count: 2}
13: {duration: "h", timeFrom: "1547323200000", timeTo: "1547326800000", objectClass: "car", count: 3}
14: {duration: "h", timeFrom: "1547323200000", timeTo: "1547326800000", objectClass: "car", count: 2}
15: {duration: "h", timeFrom: "1547323200000", timeTo: "1547326800000", objectClass: "car", count: 1}
16: {duration: "h", timeFrom: "1547323200000", timeTo: "1547326800000", objectClass: "car", count: 1}

有人知道如何修改上面的代码以获得所需的结果吗?

1 个答案:

答案 0 :(得分:1)

.groupBy(response.counterValues, (item) => { ...

应该是

.groupBy((item) => { ...

因为您使用的是_.chain()