Сгруппировать объекты по имени 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);