我正在尝试构建唯一的数组数组,这样每当我要添加新数组时,仅当集合中尚不存在该数组时才添加它
例如存储 [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]]
我尝试过的方法:
- Array.Filter:不起作用,因为数组是对象,并且
uniqueArrComparer
中的每个值都是对该数组元素的唯一对象引用。
function uniqueArrComparer(value, index, self) {
return self.indexOf(value) === index;
}
result.filter(uniqueArrComparer)
Set/Map:以为我可以构建一个唯一的数组集,但它不起作用,因为 Set 内部使用严格相等比较器 (===),它将考虑中的每个数组此案独一无二。
We cannot customize object equality for JavaScript Set将每个数组元素作为字符串存储在 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);
});
});
这个问题更像是一个学习练习,而不是任何应用程序问题。
最佳答案
一种方法是将数组转换为 JSON 字符串,然后使用 Set 获取唯一值,然后再次转换回来
var arr = [
[1, 1, 2],
[1, 2, 1],
[1, 1, 2],
[1, 2, 1],
[2, 1, 1],
[2, 1, 1]
];
let set = new Set(arr.map(JSON.stringify));
let arr2 = Array.from(set).map(JSON.parse);
console.log(arr2)
关于javascript - Map/Set 维护唯一的数组数组,Javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43772320/