Задать вопрос
@mamaanarhiya

Сделать один объект из нескольких, как?

Есть объекты вида
{status: 'approved', message: '123'}
{status: 'declined', message: '3123123'}
{status: 'approved', message: '3434342'}
{status: 'approved, message: 'asdsdfdad'}

Нужно создать один объект из них. То есть нужно взять объекты, у которых status = approved и создать один объект со свойством status: 'approved' и в message все message из каждого объекта.
То есть на выходе должно получиться что-то типа этого:
{status: 'approved', message: '123\n 3434342\n asdsdfdad'}
  • Вопрос задан
  • 272 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 4
rockon404
@rockon404
Frontend Developer
const objects = [
  {status: 'approved', message: '123'},
  {status: 'declined', message: '3123123'},
  {status: 'approved', message: '3434342'},
  {status: 'approved', message: 'asdsdfdad'},
];

const result = objects.reduce(function(acc, el, i) {
  if (el.status === 'approved') {
    acc.message += (!i ? '': '\n') + el.message;
  }

  return acc;
}, { 
  status: 'approved',
  message: '',
});
Ответ написан
Комментировать
@Interface
Как еще один вариант:
const arr = [
  {status: 'approved', message: '123'},
  {status: 'declined', message: '3123123'},
  {status: 'approved', message: '3434342'},
  {status: 'approved', message: 'asdsdfdad'}
]

const approvedMessages = arr
    .filter(n => n.status === 'approved')
    .map(n => n.message);

const obj = {
    status: 'approved',
    message: approvedMessages.join('\n'),
}
Ответ написан
Комментировать
0xD34F
@0xD34F Куратор тега JavaScript
const obj = arr
  .filter(n => n.status === 'approved')
  .reduce((p, c) => ({ ...p, message: `${p.message}\n${c.message}` }));

Или, собираем всё, а затем извлекаем, что потребуется:

const grouped = arr.reduce((acc, { status, message }) => {
  acc[status] = acc[status] || { status, messages: [] };
  acc[status].messages.push(message);
  return acc;
}, {});

Object.keys(grouped).forEach(n => grouped[n].messages = grouped[n].messages.join('\n'));


const obj = grouped.approved;
Ответ написан
Krasnodar_etc
@Krasnodar_etc
fundraiseup
let your_array = [ // Положим объекты в массив
{status: 'approved', message: '123'},
{status: 'declined', message: '3123123'},
{status: 'approved', message: '3434342'},
{status: 'approved', message: "asdsdfdad"},
]

// Результат будет объектом со свойствами === статусами
// result.approved = [ 123, 3434342,  asdsdfdad , ...]
let result = concatAtStatus(your_array);


function concatAtStatus ( arrayOfObjects = [] ) {
   let result = {};
   arrayOfObjects.forEach( elem => {
      let { status, message } = elem;
      result[status] ? result[status].push(message) : result.status = [ message ];
   });
   return result;
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы