按名称Ramda分组对象

问题描述

晚上好,我需要按其昵称对一组对象进行分组,在这里向您展示数据:

[
  {
    "nickName": "Info2","countNotice": 4
  },{
    "nickName": "Info2","countAlarm": 1
  },{
    "nickName": "Info1","countNotice": 2
  },"countAlarm": 3
  }
]

在这里,我向您展示预期的结果:

[{
  "nickName": "Info1","countNotice": 2,"countAlarm": 3
},{
  "nickName": "Info1","countAlarm": 1,"countNotice": 4
}]

我尝试在NodeJs中从MongoDB聚合,但这是不可能的。

解决方法

您可以分组,然后合并每个分组的

const res = R.compose(
  R.map(R.mergeAll),R.values,R.groupBy(R.prop("nickName"))
)(data)

实时示例

const data = [
  {
    nickName: "Info2",countNotice: 4,},{
    nickName: "Info2",countAlarm: 1,{
    nickName: "Info1",countNotice: 2,countAlarm: 3,]

const res = R.compose(
  R.map(R.mergeAll),R.groupBy(R.prop("nickName"))
)(data)

console.log(res)
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>

,

使用Array.prototype.reduce,可以按nickName对数组元素进行分组。

const input = [
  {
    "nickName": "Info2","countNotice": 4
  },{
    "nickName": "Info2","countAlarm": 1
  },{
    "nickName": "Info1","countNotice": 2
  },"countAlarm": 3
  }
];

const groupBy = input.reduce((acc,cur) => {
  acc[cur.nickName] ? acc[cur.nickName] = {
    ...acc[cur.nickName],...cur
  } : acc[cur.nickName] = cur;
  return acc;
},{});
const output = Object.values(groupBy);
console.log(output);