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

17

我有一个二维数组:

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

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

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

谢谢!


遍历数组中的每个条目,寻找重复项。这是唯一的方法。 - Kevin B
顺序重要吗?例如[[7, 3], [3, 7]]怎么处理?您是将其视为两个不同的元素,还是重复元素? - Sean
1
这个问题已经相当过时了。更新的答案在这里:https://dev59.com/XLXna4cB1Zd3GeqPQ86R#57562822 - Seph Reed
3个回答

28
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]的事情可能更快,但那样你就只限制了两个键。


13

需要使用JavaScript 1.7:

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

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

最短版本由jsN00b提供。


这是修改后的短代码 arr.map(JSON.stringify).filter((el, i , ar)=> i === ar.indexOf(el)).map(JSON.parse) - jsBug
不错!已更新答案,使用了你的版本。 - Matt

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/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接