array.reduce(), но нужно установить ключ для возвращаемого значения

#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, []))