使用javascript中的相同键将数组本身合并到另一个数组中

时间:2019-04-15 22:11:09

标签: javascript arrays algorithm typescript object

我正在尝试合并数组本身并将其转换为更有意义的数组

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,然后将颜色添加到数组中。有几个循环可以解决此问题。

我的意思是它可以完成工作,但绝对不是最佳解决方案。 任何其他理想都将受到欢迎。谢谢。

3 个答案:

答案 0 :(得分:4)

Reduce使用GenerationTreatment属性创建对象的数组。对于每个对象,检查密钥是否已经存在,如果不存在,请为该密钥创建一个新对象,其属性为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);

与其他答案不同,它不是基于“不是那么独特”的键,并且适用于任何数据。