从数组中选择所有相似的对象(通过选择键)



在不知道某些键的值的情况下,如何将数组筛选为所有在某些键上看起来相似的对象?

想象一下,我有一个这样的对象:

let list = [
{ name: 'Adam',    age: '10', uniqueStuff: 'a'},
{ name: 'Brian',   age: '2',  uniqueStuff: 'b'},
{ name: 'Carley',  age: '15', uniqueStuff: 'c'},
{ name: 'Adam',    age: '2',  uniqueStuff: 'd'},
{ name: 'Christy', age: '15', uniqueStuff: 'e'},
{ name: 'Adam',    age: '10', uniqueStuff: 'f'},
]

我希望结果是:

let list = [
{ name: 'Adam',    age: '10', uniqueStuff: 'a'},
{ name: 'Adam',    age: '10', uniqueStuff: 'f'},
]

这些可能看起来像复制品,因为它们共享相同的名称和年龄,但uniqueStuff不同。因此,我不想删除可能的重复项,而是想获得数组中所有类似对象的数组。

有点像回答";我们有多少孩子的名字年龄相同">

这将类似于MySQL的";具有count(*(>1〃;查询。

我很难找到答案或找到LoDash方法。我发现的一切都是关于删除重复项或只获取重复项,因此每个项目只有1个。相反,我希望获得所有重复和具有重复的项目。所以每个";匹配";在我的数组中应该有2个或多个项目。例如,2个或更多10岁的Adams,2个以上6岁的Amys等等。

提前感谢!

const reduced = list.reduce((prev, curr) => {
const key = `${curr.name}, ${curr.age}`
return {
...prev,
[key]: [...(prev[key] || []), curr]
}
}, {})
const filtered = Object.values(reduced).filter(v => v.length > 1)
const flatted = filtered.flat()

如果您喜欢在一个数组中包含每组2个,则可以删除最后一行。

最新更新