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