#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)