如何合并数组中存在的对象数组并删除重复项(如果有)?

问题描述 投票:0回答:1

我有一个数组,其中包含另一个具有键值对的对象数组。我想根据每个对象中常见的键来合并和分离这些对象数组。可以有 n 个对象数组。

array1 = [
  [ 
    { Time: 45, Element: 'Hi'},
    { Time: 55, Element: 'Hi' },
    { Time: 65, Element: 'Hi' }
  ],
  [
    { Time: 45, Element: 'Hi' }, 
    { Time: 55, Element: 'Hi' },
    { Time: 65, Element: 'Hi' },
    { Time: 25, Element: 'Hello' }, 
    { Time: 35, Element: 'Hello' }, 
    { Time: 20, Element: 'Hello' }
  ],
  [
    { Time: 45, Element: 'Hi' },
    { Time: 55, Element: 'Hi' },
    { Time: 65, Element: 'Hi' },
    { Time: 25, Element: 'Hello' },
    { Time: 35, Element: 'Hello' },
    { Time: 20, Element: 'Hello' },
    { Time:100, Element: 'Bye'}
  ]
];

我对合并数组的期望如下:

mergedArray = [
  [ 
    { Time: 45, Element: 'Hi'},
    { Time: 55, Element: 'Hi' },
    { Time: 65, Element: 'Hi' }
  ],
  [
    { Time: 25, Element: 'Hello' }, 
    { Time: 35, Element: 'Hello' }, 
    { Time: 20, Element: 'Hello' }
  ],
  [
    { Time:100, Element: 'Bye'}
  ]
];

如何在Javascript中实现这一点?

我尝试了以下代码

arrays = [
  [ 
    { Time: 45, Element: 'Hi'},
    { Time: 55, Element: 'Hi' },
    { Time: 65, Element: 'Hi' }
  ],

  [
    { Time: 45, Element: 'Hi' }, 
    { Time: 55, Element: 'Hi' },
    { Time: 65, Element: 'Hi' },
    { Time: 25, Element: 'Hello' }, 
    { Time: 35, Element: 'Hello' }, 
    { Time: 20, Element: 'Hello' }
  ],
  [
    { Time: 45, Element: 'Hi' },
    { Time: 55, Element: 'Hi' },
    { Time: 65, Element: 'Hi' },
    { Time: 25, Element: 'Hello' },
    { Time: 35, Element: 'Hello' },
    { Time: 20, Element: 'Hello' },
    { Time:100, Element: 'Bye'}
  ]
];

const uniqueMergedArray = arrays.reduce((result, obj) => {
  if (!result.some(item => item.Element === obj.Element)) {
    result.push(obj);
  }
  return result;
}, [])

console.log("Merged Array:", uniqueMergedArray);

上面的代码只返回第一个数组。请建议一种简单的方法来合并对象数组并获得三个不同的、没有重复项的唯一数组。预先感谢。

javascript arrays object filtering
1个回答
0
投票

obj
回调中的
.reduce()
代表内部数组之一,而不是对象,因此您没有正确迭代内部数组并检查对象。我建议在内部
.map()
中使用
.filter()
,并在末尾添加一个
filter()
以删除空数组:

const arrays = [ [{Time: 45,Element:'Hi'},{Time: 55, Element: 'Hi' },{ Time: 65, Element: 'Hi' }], [{Time: 45,Element:'Hi' }, { Time: 55, Element: 'Hi'},{Time: 65, Element: 'Hi' }, {Time: 25,Element:'Hello' }, { Time: 35, Element: 'Hello' }, { Time: 20, Element: 'Hello' }], [{Time: 45,Element:'Hi' },{ Time: 55, Element: 'Hi'},{Time: 65, Element: 'Hi' }, {Time: 25,Element:'Hello'},{Time: 35, Element: 'Hello'},{Time: 20, Element: 'Hello'},       {Time:100, Element: 'Bye'}] ];

const timeElementSet = new Set();
const uniqueMergedArray = arrays.map(arr => arr.filter(obj => {
  const key = `${obj.Time}$${obj.Element}`;
  if (timeElementSet.has(key)) return false;
  timeElementSet.add(key);
  return true;
})).filter(arr => arr.length > 0);

console.log("Merged Array:", uniqueMergedArray);

上面使用

.map()
将每个内部数组转换为其自身的过滤版本。在过滤器函数中,我使用
Set
来跟踪通过创建
Time
形状的对象的序列化版本已经看到的
Element
Time$Element
对。这允许我们检查该对象是否已经被看到,然后我们可以使用它返回
true
/
false
来保留当前元素。

© www.soinside.com 2019 - 2024. All rights reserved.