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

IT技术 javascript arrays multidimensional-array duplicates
2021-03-08 19:41:29

我有一个二维数组:

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

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

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

谢谢!

3个回答
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],但是您将自己限制为只有两个键。

这需要 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]]
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/