我有一个多维数组:
[[7,3], [7,3], [3,8], [7,3], [7,3], [1,2]]
有没有聪明的方法可以从中删除重复的元素? 它应该返回这样的数组:
[[7,3], [3,8], [1,2]]
谢谢!
答案 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);