Map/Set维护唯一的数组数组,Javascript

Roh*_*hit 5 javascript arrays unique set filter

我正在尝试构建唯一的数组数组,这样每当我有新数组添加它时,只应添加它,如果它不存在于集合中

例如,存储[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]]

我试过的方法:

  1. Array.Filter:不起作用,因为数组是对象,每个值uniqueArrComparer都是对该数组元素的唯一对象引用.
function uniqueArrComparer(value, index, self) {
  return self.indexOf(value) === index;
}

result.filter(uniqueArrComparer)
Run Code Online (Sandbox Code Playgroud)
  1. 设置/映射:我认为我可以构建一个唯一的数组,但它不起作用,因为Set内部使用了严格的相等比较器(===),它将在这种情况下将每个数组视为唯一.
    我们无法为JavaScript Set自定义对象相等性

  2. 将每个数组元素作为字符串存储在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);
      });
  });
Run Code Online (Sandbox Code Playgroud)

这个问题比任何应用程序问题更像是一种学习练习.

ade*_*neo 8

一种方法是将数组转换为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)
Run Code Online (Sandbox Code Playgroud)