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

标签 javascript arrays filter set unique

我正在尝试构建唯一的数组数组,这样每当我要添加新数组时,仅当集合中尚不存在该数组时才添加它

例如存储 [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)
  • 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/

    相关文章:

    Java Jsyn设置过滤器的输入、处理和获取输出

    arrays - 在 scala 中,如何在 zip 两个数组后进行过滤

    javascript - 弃用警告 : Calling an asynchronous function without callback is deprecated

    php - 像 PHP 的 include 一样加载 Javascript

    javascript - 如果验证没有问题,请打开新窗口

    javascript - console.log消息下面打印的数字是什么意思?

    ios - 从 Firebase 填充的 CLLocationCooperative2D 数组不保留其条目。 swift 4

    jquery - 如何使用 JQuery 将 HTML 表单字段作为数组直接传递到 CodeIgniter 中的数据库

    select - 对特定表列的 Odata 查询

    angularjs - 访问一个数组的索引以获取另一个数组