【问题标题】:How to remove duplicates from a two-dimensional array? [closed]如何从二维数组中删除重复项? [关闭]
【发布时间】:2013-12-18 19:41:24
【问题描述】:

我有一个二维数组:

[[7,3], [7,3], [3,8], [7,3], [7,3], [1,2]]

有什么聪明的方法可以从中删除重复的元素吗? 它应该返回这样的数组:

[[7,3], [3,8], [1,2]]

谢谢!

【问题讨论】:

  • 遍历数组中的每个条目,寻找重复项。这是唯一的方法。
  • 顺序重要吗?例如[[7, 3], [3, 7]] 呢?你想把它当作两个不同的元素,还是重复的元素?
  • 这个问题已经过时了。这里有更新的答案:stackoverflow.com/questions/57562611/…

标签: javascript arrays multidimensional-array duplicates


【解决方案1】:
arr = [[7,3], [7,3], [3,8], [7,3], [7,3], [1,2]];

function multiDimensionalUnique(arr) {
    var uniques = [];
    var itemsFound = {};
    for(var i = 0, l = arr.length; i < l; i++) {
        var stringified = JSON.stringify(arr[i]);
        if(itemsFound[stringified]) { continue; }
        uniques.push(arr[i]);
        itemsFound[stringified] = true;
    }
    return uniques;
}

multiDimensionalUnique(arr);

说明:

就像你提到的,另一个问题只涉及一维数组。你可以通过 indexOf 找到它。这很容易。多维数组并不容易,因为 indexOf 不能在里面查找数组。

我能想到的最直接的方法是序列化数组值,并存储它是否已经找到。执行stringified = arr[i][0]+":"+arr[i][1] 之类的操作可能会更快,但是您将自己限制为只有两个键。

【讨论】:

    【解决方案2】:
    var origin = [[7,3], [7,3], [3,8], [7,3], [7,3], [1,2]];
    
    function arrayEqual(a, b) {
        if (a.length !== b.length) { return false; }
        for (var i = 0; i < a.length; ++i) {
            if (a[i] !== b[i]) {
                return false;
            }
        }
        return true;
    }
    
    function contains(array, item) {
        for (var i = 0; i < array.length; ++i) {
            if (arrayEqual(array[i], item)) {
                return true;
            }
        }
        return false;
    }
    
    function normalize(array) {
        var result = [];
        for (var i = 0; i < array.length; ++i) {
            if (!contains(result, array[i])) {
                result.push(array[i]);
            }
        }
        return result;
    }
    
    var result = normalize(origin);
    console.log(result);
    

    http://jsfiddle.net/2UQH6/

    【讨论】:

      【解决方案3】:

      这需要 JavaScript 1.7:

      var arr = [[7,3], [7,3], [3,8], [7,3], [7,3], [1,2]];
      
      arr.map(JSON.stringify).reverse().filter((e, i, a) => a.indexOf(e, i+1) === -1).reverse().map(JSON.parse) // [[7,3], [3,8], [1,2]]
      

      【讨论】:

        猜你喜欢
        • 2017-11-06
        • 1970-01-01
        • 1970-01-01
        • 2019-05-02
        • 1970-01-01
        • 1970-01-01
        • 2018-11-17
        • 1970-01-01
        • 2017-05-07
        相关资源
        最近更新 更多