我正在尝试构建唯一的数组数组,这样每当我要添加新数组时,只有在集合中尚不存在该数组时才应添加它
例如。存储 [1,1,2] 的所有唯一排列
实际的 :[[1,1,2],[1,2,1],[1,1,2],[1,2,1],[2,1,1],[2,1,1]]
预期的 :[[1,1,2],[1,2,1],[2,1,1]]
我尝试过的方法:
-
数组.过滤器:不起作用,因为数组是对象,并且每个值都在
uniqueArrComparer
是对该数组元素的唯一对象引用。
function uniqueArrComparer(value, index, self) {
return self.indexOf(value) === index;
}
result.filter(uniqueArrComparer)
-
Set/Map:我以为我可以构建一个唯一的数组集,但它不起作用,因为 Set 内部使用严格相等比较器 (===),它将认为本例中的每个数组都是唯一的。
我们无法为 JavaScript Set 自定义对象相等性 https://stackoverflow.com/q/29759480/351708
-
将每个数组元素作为字符串存储在 Set/Map/Array 中,并构建一个唯一字符串数组。最后使用唯一字符串数组构建数组数组。这种方法可行,但看起来不像有效的解决方案。
使用 Set 的工作解决方案
let result = new Set();
// Store [1,1,2] as "1,1,2"
result.add(permutation.toString());
return Array.from(result)
.map(function(permutationStr) {
return permutationStr
.split(",")
.map(function(value) {
return parseInt(value, 10);
});
});
这个问题更多的是一个学习练习,而不是任何应用问题。