正如我在评论中提到的,只有当对象引用同一实例时才相等。因此,任何内置系统都不会做到这一点,尤其是
==
和
===
。所以,首先你必须定义自己的比较函数。
假设两个对象包含相同的键和相同的值,则它们相等。
function areObjectsEqual(a,b) {
function helper(a,b) {
var k;
for( k in a) {
if( a.hasOwnProperty(k)) {
if( !b.hasOwnProperty(k)) return false;
if( typeof a[k] != typeof b[k]) return false;
if( typeof a[k] == "object") {
if( !areObjectsEqual(a[k],b[k])) return false;
}
else {
if( a[k] != b[k]) return false;
}
}
}
}
return helper(a,b) && helper(b,a);
}
好的,既然这件事处理完了,我们可以比较一下我们的函数。
function array_diff(a,b) {
var result = [], l = a.length, i, m = b.length, j;
outer:
for( i=0; i<l; i++) {
for( j=0; j<m; j++) {
if( typeof a[i] != typeof b[j]) continue;
if( typeof a[i] == "object") {
if( !areObjectsEqual(a[i],b[j])) continue;
}
else {
if( a[i] != b[j]) continue;
}
continue outer;
}
result.push(a[i]);
}
return result;
}
好的,没问题!