Как объединить значения столбцов из массива объектов в один объект со строковыми значениями в JavaScript - PullRequest
0 голосов
/ 06 мая 2020

У меня есть массив с более чем одной строкой (он может варьироваться), как показано ниже.

const myArray = [{
    name: 'user 100', name2: 'user200', name3: 'user300',
}, {
    name: 'user 101', name2: 'user201', name3: 'user301',
}, {
    name: 'user 102', name2: 'user202', name3: 'user302',
}];

Я хочу объединить / объединить все эти строки в 1, как показано ниже:

{
    name: 'user 100 user 101 user 102',
    name2: 'user200 user 201 user 203',
    name3: 'user300 user 301 user 303',
}

Ответы [ 2 ]

1 голос
/ 06 мая 2020

Это похоже на хороший случай для reduce, он будет l oop по каждому элементу в вашем массиве, позволяя вам отслеживать атрибуты для всех элементов.

prev начинается так же, как и вы указан во втором параметре (в нашем случае это {})

next - это элемент из вашего массива, начиная с 0-го

Используйте Object.keys для l oop over каждый атрибут в вашем элементе массива, добавляя их к исходному пустому объекту и передавая его.

prev начинается пустым, но после первого l oop он сохраняет все свойства элемента 1, второго l oop он имеет элемент 1 + элемент 2, et c до тех пор, пока он не завершит цикл.

let myArray = [ {name: 'user 100', name2: 'user200', name3: 'user300'},{name: 'user 101', name2: 'user201', name3: 'user301'}, {name: 'user 102', name2: 'user202', name3: 'user302'} ];

let combined = myArray.reduce((prev, next) => {
  Object.keys(next).forEach(key => {
    prev[key] = (prev[key] ? prev[key] + ' ' : '') + next[key];
  });
  return prev;
}, {})
    
console.log(combined);
1 голос
/ 06 мая 2020

Вы можете сделать это, используя Array.prototype.forEach() и Object.entries():

const arr = [{
  name: 'user 100', name2: 'user200', name3: 'user300',
}, {
  name: 'user 101', name2: 'user201', name3: 'user301',
}, {
  name: 'user 102', name2: 'user202', name3: 'user302',
}];

const result = {};

arr.forEach((item, index) => {
  Object.entries(item).map(([key, value]) => {
    result[key] = `${ (result[key] || '')  } ${ value }`;
  });
});

console.log(result);

То же самое можно сделать, используя Array.prototype.reduce() вместо Array.prototype.forEach():

const arr = [{
  name: 'user 100', name2: 'user200', name3: 'user300',
}, {
  name: 'user 101', name2: 'user201', name3: 'user301',
}, {
  name: 'user 102', name2: 'user202', name3: 'user302',
}];

const combined = arr.reduce((result, item) => {
  Object.entries(item).map(([key, value]) => {
    result[key] = `${ (result[key] || '')  } ${ value }`;
  });
  
  return result;
}, {});

console.log(combined);
...