如何从多维数组中删除重复项?

时间:2013-12-02 22:49:19

标签: javascript arrays multidimensional-array unique

我有一个多维数组:

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

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

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

谢谢!

3 个答案:

答案 0 :(得分:10)

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]之类的操作可能会更快,但您只能将自己限制为两个键。

答案 1 :(得分:3)

这需要JavaScript 1.7:

var arr = [[7,3], [7,3], [3,8], [7,3], [7,3], [1,2]];

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

答案 2 :(得分:1)

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/