Преобразовать массив reduce'ом
Как преобразовать массив так, чтобы сложить все не пустые 'arr' и запушить в них соответствующий объект "user" ?
//исходный массив
let test = [{
id: 1,
user: {
user_id: 1
},
array: [{
arr: 1.1,
},
{
arr: 1.2,
},
]
},
{
id: 2,
user: {
user_id: 2
},
array: [{
arr: 2.1,
}, ]
},
{
id: 3,
user: {
user_id: 3
},
array: []
}
]
//результат преобразования
let result = [{
arr: 1.1,
user: {
user_id: 1
},
},
{
arr: 1.2,
user: {
user_id: 1
},
},
{
arr: 2.1,
user: {
user_id: 2
},
},
]
Получилось наваять вот такое:
let res = []
test.reduce((acc, cur, index) => {
if (cur.array.length) {
acc[cur.user.user_id] = acc[cur.user.user_id] || {
array: cur.array,
};
let a = cur.array.map(item => {
let b = item
b.user = cur.user
return bbb
})
res.push(a)
return acc;
}
}, {})
Как можно упростить?
Ответы (2 шт):
Автор решения: Alexander Chernin
→ Ссылка
//Исходные данные
let test = [...];
// Вспомогательный ассоциативный массив
const m = new Map();
// Через reduce
test.reduce( (acc, cur, index) => {
cur.array.forEach( a => {
if ( !m.has(a.arr) ) {
m.set(a.arr, {
arr: a.arr,
user: cur.user
});
}
});
return cur;
}, test[0]);
// Или через forEach
test.forEach( t => {
t.array.forEach( a => {
// Если в массиве нет такого ключа, то добавляем
if ( !m.has(a.arr) ) {
// Добавляем ключ-значение
m.set(a.arr, {
arr: a.arr,
user: t.user
});
}
});
});
// Результат в обоих случаях одинаковый
const result = Array.from(m.values());
console.log(result);
/*
[ { arr: 1.1, user: { user_id: 1 } },
{ arr: 1.2, user: { user_id: 1 } },
{ arr: 2.1, user: { user_id: 2 } } ]
*/
Автор решения: Qwertiy
→ Ссылка
Возможно, так:
var data = [{
id: 1,
user: { user_id: 1 },
array: [{ arr: 1.1 }, { arr: 1.2 }]
}, {
id: 2,
user: { user_id: 2 },
array: [{ arr: 2.1 }]
}, {
id: 3,
user: { user_id: 3 },
array: []
}]
console.log(data.flatMap(({ user, array }) => array.map(({ arr }) => ({ arr, user }))))
.as-console-wrapper.as-console-wrapper { max-height: 100vh }
Или так:
var data = [{
id: 1,
user: { user_id: 1 },
array: [{ arr: 1.1 }, { arr: 1.2 }]
}, {
id: 2,
user: { user_id: 2 },
array: [{ arr: 2.1 }]
}, {
id: 3,
user: { user_id: 3 },
array: []
}]
console.log(data.flatMap(({ user, array }) => array.map(({ arr }) => ({ arr, user: { ...user } }))))
.as-console-wrapper.as-console-wrapper { max-height: 100vh }