我有一组需要过滤掉重复项的数组。它需要以这样一种方式工作:每个数组中没有重复项,并且在总组中,没有两个数组具有相同的值。
第一部分很简单-对于每个内部数组,我都可以应用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]]
如果您集合中的数据易于序列化,那么我会选择这样的解决方案:
const data = [
["a", "b", "b"],
["c","c"],
["b","a"],
["d","a"],
["c","c"],
["e","e"]
];
// Create the "hash" of your set
const serializeSet = s => Array
.from(s)
.sort()
.join("___");
// Create a map (or object) that ensures 1 entry per hash
const outputMap = data
.map(xs => new Set(xs))
.reduce(
(acc, s) => acc.set(serializeSet(s), s),
new Map()
);
// Turn your Map and Sets back in to arrays
const output = Array
.from(outputMap.values())
.map(s => Array.from(s));
console.log(output);
要为您的集合提供良好的哈希函数,您需要对数据进行良好的外观。例如:
sort
使用默认的排序器对这些字符串进行排序,然后使用az范围之外的字符join
对结果进行排序。JSON.stringify(Array.from(s).sort())
则使用起来更安全JSON.stringify
对其进行排序,但是要注意对象属性顺序的差异!(例如{a: 1, b: 2}
vs {b: 2, a: 1}
)本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句