如果数组一遍又一遍地包含相同的对象,你可以做一个这样的函数:
var oa = {"a":"b"},
ob = {"c":"d"};
var array = [oa, ob, oa];
function unique(a) {
var arr = [];
for(var i = 0; i < a.length; i++) {
if( !arr.indexOf(a[i]) == -1 ) {
arr.push(a[i]);
}
}
return arr;
}
但这很可能不起作用,因为即使它们接缝相同,对象也是不同的:
alert( {a: 1} === {a: 1} ); // false
但是:
var a = {a: 1};
alert( a === a ); // true
即使这也是真的:
var a = {a: 1},
b = a;
alert( a === b ); // true
所以你也必须对此进行测试(这是一个浅显的描述。一个级别的对象):
function isEqual(a, b) {
var prop;
for( prop in a ) {
if ( a[prop] !== b[prop] ) return false;
}
for( prop in b ) {
if ( b[prop] !== a[prop] ) return false;
}
return true;
}
我们还必须重写我们独特的函数:
function unique(a) {
var isAdded,
arr = [];
for(var i = 0; i < a.length; i++) {
isAdded = arr.some(function(v) {
return isEqual(v, a[i]);
});
if( !isAdded ) {
arr.push(a[i]);
}
}
return arr;
}
完整代码:
var a = [{"a":"b"},{"c":"d"},{"a":"b"}],
b = unique(a); // [{"a":"b"},{"c":"d"}]
function unique(a) {
var isAdded,
arr = [];
for(var i = 0; i < a.length; i++) {
isAdded = arr.some(function(v) {
return isEqual(v, a[i]);
});
if( !isAdded ) {
arr.push(a[i]);
}
}
return arr;
}
function isEqual(a, b) {
var prop;
for( prop in a ) {
if ( a[prop] !== b[prop] ) return false;
}
for( prop in b ) {
if ( b[prop] !== a[prop] ) return false;
}
return true;
}
注意某些方法的使用取决于 ECMAScript 第 5 版:
Array.some
Array.indexOf