Сгруппировать объекты по имени Ramda

Добрый вечер, мне нужно сгруппировать массив объектов по их нику, вот показываю данные:

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

здесь я покажу вам ожидаемый результат:

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

Я пробовал агрегировать из MongoDB в NodeJs, но это было невозможно.

2 ответа

Вы можете сгруппировать, а затем объединить каждую сгруппированную

       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,
  },
  {
    nickName: "Info1",
    countAlarm: 3,
  },
]

const res = R.compose(
  R.map(R.mergeAll),
  R.values,
  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
  },
  {
    "nickName": "Info1",
    "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);

Другие вопросы по тегам