Как преобразовать массив объектов в один объект с помощью reduce?

#javascript #node.js

#javascript #node.js

Вопрос:

У меня есть следующий массив объектов.

 [
  { claimNumber1: 'R12345', checkNumber1: '' },
  { claimNumber2: 'T1234', checkNumber2: 'abcd' },
  { claimNumber3: 'Z4567', checkNumber3: 'qwer' }
]
 

Используя reduce , я хочу преобразовать это в приведенное ниже.

 {
    claimNumber1:'R12345',
    checkNumber1:'',
    claimNumber2:'T1234',
    checkNumber2:'',
    claimNumber3:'Z4567',
    checkNumber3:'',

}
 

Я попробовал ниже, но не получил того, что ожидал.

 .reduce((obj, item) =>{
    return {...obj,item}
} ,{});
 

Комментарии:

1. Просто используйте Object.assign(...arr)

Ответ №1:

Вы должны распространить item объект, потому item что это объект

 const arr = [
  { claimNumber1: "R12345", checkNumber1: "" },
  { claimNumber2: "T1234", checkNumber2: "abcd" },
  { claimNumber3: "Z4567", checkNumber3: "qwer" },
];

const result = arr.reduce((obj, item, i) => {
  return { ...obj, ...item, [`checkNumber${i   1}`]: "" };
}, {});

console.log(result); 

Комментарии:

1. еще раз взгляните на результат, который требуется для операции.

2. @Andy Отредактированный ответ, спасибо за отзыв

Ответ №2:

Почти есть. Вам просто нужно spread item также.

 .reduce((obj, item) => {
  return {
    ...obj,
    ...item,
  };
}, {});
 

Комментарии:

1. Как вы различаете ключи в этом примере?

Ответ №3:

Я думаю, вам следует распространить каждый элемент в reducer. Вот мой код.

 const res = arr.reduce((prev, item) => {
 return { ...prev, ...item };
}, {});
 

И результат

 {
  claimNumber1: 'R12345',
  checkNumber1: '',
  claimNumber2: 'T1234',
  checkNumber2: 'abcd',
  claimNumber3: 'Z4567',
  checkNumber3: 'qwer'
}
 

Комментарии:

1. Это не тот результат, который требуется для операции.

Ответ №4:

Я не уверен в преимуществе использования reduce в этой ситуации. Простой цикл был бы самодокументируемым и его было бы легче читать.

 const data = [
  { claimNumber1: 'R12345', checkNumber1: '' },
  { claimNumber2: 'T1234', checkNumber2: 'abcd' },
  { claimNumber3: 'Z4567', checkNumber3: 'qwer' }
];

const out = {};

// For every object in the array
for (const obj of data) {

  // Get an array of its keys and iterate over them
  for (const key of Object.keys(obj)) {

    // If it's a claim add that value to the output
    // object property, otherwise set that property value
    // to an empty string.
    if (key.startsWith('claim')) {
      out[key] = obj[key];
    } else {
      out[key] = '';
    }
  }
}

console.log(out); 

Дополнительная документация