我有一组数组需要过滤重复项。它需要按照这样的方式工作:在每个数组内部没有重复项,在整个组中,没有两个数组持有相同的值。
第一部分很容易- 对于每个内部数组,我可以将Set
应用于该数组并进行过滤。因此,对于给定的矩阵arrays
,我可以应用以下方法进行过滤:
const sets : string[][] = arrays.map(arr=>[...new Set(arr)].sort());
这将给我一个集合数组。如何将其转换为一组集合?例如,如果 sets=[[a, b],[c],[d, a],[c],[e]]
,我想让 setOfSets
等于 [[a, b],[c],[d, a],[e]]
?
应用 setOfSets = [...new Set(sets)];
将不起作用,因为默认情况下,即使它们具有不同的地址,相等的数组也不被视为相等。是否有一种方法来强制 set
按值进行检查,或者另一种有效的方法来创建这种效果?
编辑
原始矩阵:
[[a, b, b],
[c,c],
[b,a],
[d,a],
[c,c],
[e,e]]
创建并排序集合后:
[[a,b],
[c],
[a,b],
[d,a],
[c],
[e]]
期望的结果:
[[a,b],
[c],
[d,a],
[e]]
JSON.stringify
。也许这更有意义:serializeSet = s => JSON.stringify(Array.from(s).sort())
。 - user3297291(acc, s) => acc.set(serializeSet(s), s)
时,我会收到错误提示property 'set' does not exist on type 'string[]'
(如果我完全按照你的代码来,则是on type Set<string>
)。我正在使用TypeScript - 请帮助我理解reduce函数应该做什么? - PMO1948reduce
函数将你的包含集合的数组缩减成一个Map
对象。这个Map
就像是一个键和值为string, Set
类型的字典。为了让reduce
函数正常工作,你需要传入一个函数,该函数会将一个集合添加到Map
中并返回它 ((acc, s) => acc.set(serialize(s), s)
),还需要提供一个初始为空的Map
(new Map()
).另一种方法是首先将数组转换为条目数组:const setEntries = mySets.map(s => [ serialize(s), s ])
,然后使用这些条目构造一个Map
:const uniqueSetMap = new Map(setEntries)
。 - user3297291reduce
的第二个参数, new Map()
。 - user3297291