JavaScript разгруппирует данные в объекте

#javascript #arrays

#javascript #массивы

Вопрос:

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

 [{
    group: 'abc',
    data: [{
       name: 'John',
       age: 10
    }, {
       name: 'Alice',
       age: 15
    }]
}, {
    group: 'def',
    data: [{
       name: 'Scott',
       age: 20
    }, {
       name: 'Tamar',
       age: 25
    }]
}]
  

и я хотел, чтобы это было что-то вроде этого (чтобы группа была рядом с данными):

 [{
   group: 'abc',
   name: 'John',
   age: 10
}, {
   group: 'abc',
   name: 'Alice',
   age: 15
}, {
   group: 'def',
   name: 'Scott',
   age: 20
}, {
   group: 'def',
   name: 'Tamar',
   age: 25
}]
  

Любые идеи будут оценены.

Ответ №1:

 const a = [
  {group: 'abc', data: [{name: 'John', age: 10}, {name: 'Alice', age: 15}]},
  {group: 'def', data: [{name: 'Scott', age: 20}, {name: 'Tamar', age: 25}]}
];

const flat = a.flatMap(({group, data}) => data.map(o => Object.assign({group}, o)));
console.log(flat)

// Unmodified original Array:
console.log(a)  

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

1. Вы изменяете исходные объекты. Поскольку вы не используете массив, созданный Array.map() , используйте Array.forEach() вместо.

2. @OriDrori, похоже, поздний час, спасибо за дополнительную пару глаз. Улучшено с учетом

Ответ №2:

Array#reduce было бы полезно.

 const a = [{group:'abc',data:[{name:'John',age:10},{name:'Alice',age:15}]},{group:'def',data:[{name:'Scott',age:20},{name:'Tamar',age:25}]}];

const r = a.reduce((s, { group, data }) =>
   (data.forEach((o) => s.push({ ...o, group })), s), []);

console.log(r);  

Ответ №3:

Выполните итерацию массива с Array.flatMap() помощью, затем сопоставьте каждую группу и создайте новые объекты, используя object spread:

 const arr = [{"group":"abc","data":[{"name":"John","age":10},{"name":"Alice","age":15}]},{"group":"def","data":[{"name":"Scott","age":20},{"name":"Tamar","age":25}]}]

const result = arr.flatMap(({ group, data }) => data.map(o => ({ group, ...o })))

console.log(result)