我正在尝试合并数组本身并将其转换为更有意义的数组
array = [
{item: 'pen', madeIn: 'US', color: 'blue'},
{item: 'pen', madeIn: 'US', color: 'white'},
{item: 'pen', madeIn: 'China', color: 'red'},
{item: 'pen', madeIn: 'China', color: 'white'}
]
我想产生的输出数组:
outputArray = [
{item: 'pen', madeIn: 'US', color: ['blue', 'white']},
{item: 'pen', madeIn: 'China', color: ['red', 'white']}
];
我一直在尝试,但是没有运气,目前我能想到的唯一解决方案是使用临时变量存储项目和madeIn值。然后运行另一个循环以比较item和madeIn,然后将颜色添加到数组中。有几个循环可以解决此问题。
我的意思是它可以完成工作,但绝对不是最佳解决方案。 任何其他理想都将受到欢迎。谢谢。
答案 0 :(得分:4)
Reduce使用Generation
和Treatment
属性创建对象的数组。对于每个对象,检查密钥是否已经存在,如果不存在,请为该密钥创建一个新对象,其属性为item
作为空数组。将每个对象的madeIn
推入数组。使用Object.values()
将对象转换为数组。
color
答案 1 :(得分:1)
使用reduce
:
const array = [{ item: 'pen', madeIn: 'US', color: 'blue' }, { item: 'pen', madeIn: 'US', color: 'white' }, { item: 'pen', madeIn: 'China', color: 'red' }, { item: 'pen', madeIn: 'China', color: 'white' }];
const output = Object.values(array.reduce((acc, { item, madeIn, color}) => {
acc[`${item}-${madeIn}`] = acc[`${item}-${madeIn}`] || { item, madeIn, color: [] };
acc[`${item}-${madeIn}`].color.push(color);
return acc;
}));
console.log(output);
答案 2 :(得分:1)
以下是使用Array.prototype.reduce()
和对象分解的解决方案:
const initialArray = [
{item: 'pen', madeIn: 'US', color: 'blue'},
{item: 'pen', madeIn: 'US', color: 'white'},
{item: 'pen', madeIn: 'China', color: 'red'},
{item: 'pen', madeIn: 'China', color: 'white'}
];
const finalArray = initialArray.reduce((accumulator, currentValue) => {
const item = accumulator.find(x => x.item === currentValue.item && x.madeIn === currentValue.madeIn);
if(item) {
item.color.push(currentValue.color);
}
else {
accumulator.push({...currentValue, color: [currentValue.color]});
}
return accumulator;
}, []);
console.log(finalArray);
与其他答案不同,它不是基于“不是那么独特”的键,并且适用于任何数据。