#javascript #node.js #reduce
Вопрос:
У меня есть массив, в котором я использую .reduce, чтобы сгруппировать все совпадающие идентификаторы массива в новый массив с идентификатором.
Проблема в том, что мой вывод выглядит так
[
{
CHb5591f5db2a546d3af: [ [Object], [Object] ],
CH5e86016c8b894d9d87: [ [Object], [Object], [Object], [Object], [Object], [Object] ]
}
]
Мне нужно иметь такой вывод
[
{id: CHb5591f5db2a546d3af, content: [ [Object], [Object] ]},
{id: CH5e86016c8b894d9d87, content: [ [Object], [Object], [Object], [Object], [Object], [Object] ]}
]
Вот моя попытка использовать функцию reducer
result = await response.reduce(function (a, i) {
a[i.messagesId] = a[i.messagesId] || []; //it generates a new property i.messagesId with an array if it does not exist (the value of not existing properties is undefined). if exist, it assign itself
a[i.messagesId].push(i);
return a;
}, Object.create({}));
Ответ №1:
Если внутри массива есть один объект, вы можете легко добиться этого с помощью Object.entries()
Для демонстрационных целей я использовал "object"
в качестве строки
const arr = [
{
CHb5591f5db2a546d3af: [["Object"], ["Object"]],
CH5e86016c8b894d9d87: [
["Object"],
["Object"],
["Object"],
["Object"],
["Object"],
["Object"],
],
},
];
const result = Object.entries(arr[0]).map(([id, content]) => ({ id, content }));
console.log(result);
Комментарии:
1. Это сработало для меня, я немного почитаю Object.entries . Я отмечу этот ответ, как только он позволит
Ответ №2:
Может быть, это то, что вы ищете. У нас есть Array.prototype.reduce()
метод, который возвращает наш желаемый массив объектов.
const array = [
{
'CHb5591f5db2a546d3af':
[
{ animal: 'Cat', name: 'Tom' },
{ animal: 'Dog', name: 'Bruno' }
]
},
{
'CH5e86016c8b894d9d87':
[
{ animal: 'Alligator', name: 'Mike' }
]
},
{
'CH5e86016c8b894d9d97':
undefined
}
]
const reducer = function (acc, item) {
for (const _key in item) {
acc.push({
'id': _key,
'content': item[_key]
})
}
return acc;
}
console.log(array.reduce(reducer, []))