如何压缩对象数组



我在下面有一个订单数组,我想通过名称浓缩它,然后有一个人订购的所有项目的数组

const orders = [
{ name: 'Tedd', item: 'coke', },
{ name: 'Louise', item: 'burger' },
{ name: 'Louise', item: 'chips' },
{ name: 'David', item: 'chips' },
{ name: 'David', item: 'burger' },
{ name: 'David', item: 'coke' }
]

我想要它的样子

[
{ name: 'Tedd', item: ['coke'] },
{ name: 'Louise', item: ['burger', 'chips'] },
{ name: 'David', item: ['chips', 'burger', 'coke'] }
]

I tried this

const out = [...new Set(orders.map(i => i.name))].map(i => {
return { name: i, item: orders.reduce((a, b) => [a.item].concat([b.item])) }
})

但是它只是连接了所有的顺序

[
{ name: 'Tedd', item: ['chips', 'burger', 'coke'] },
{ name: 'Louise', item: ['chips', 'burger', 'coke'] },
{ name: 'David', item: ['chips', 'burger', 'coke'] }
]

reduce可能对这个特殊的问题很有用。

orders.reduce((acc, curr) => {
const personIndex = acc.findIndex((item) => item.name === curr.name);
if (personIndex === -1) {
acc.push({ name: curr.name, item: [curr.item] });
} else {
acc[personIndex].item.push(curr.item);
}
return acc;
}, []);

将数组缩减为一个对象,其中name为键,收集的项为值,然后对对象的键运行映射以返回所需的数组。

const obj = orders.reduce((map, order) => {
const { name } = order;
if (map[name]) {
map[name].push(order.item);
} else {
map[name] = [order.item];
}
return map}, {})
const output = Object.keys(obj).map(key => ({name:key,item:obj[key]}))
console.log(output)

使用forEach并构建对象。如果存在与key相同的名称,则push到现有数组。从构建对象中获取Object.values

const condence = arr => {
const all = {};
arr.forEach(({name, item}) => {
all[name] ||= {name, item: []};
all[name].item.push(item);
})
return Object.values(all);
}
const orders = [
{ name: 'Tedd', item: 'coke', },
{ name: 'Louise', item: 'burger' },
{ name: 'Louise', item: 'chips' },
{ name: 'David', item: 'chips' },
{ name: 'David', item: 'burger' },
{ name: 'David', item: 'coke' }
]
console.log(condence(orders))

最新更新