比较两个Javascript关联数组
我在这里搜索了一种比较javascript中关联数组的高质量方法。我找到的唯一体面的解决方案是具有一些比较数组函数的项目。唯一的问题是,这些函数将第一个数组视为第二个数组的密钥。在我的情况下,至少两个数组并不总是具有相同的键或相同的键。这会导致函数输出的结果不包括array1中可能不存在但array2中存在的键。到目前为止,我唯一能想到的是在参数翻转的情况下运行array_diff_associative()函数两次,然后将它们组合起来(这似乎有问题,因为第一个参数再次用作第二个参数的键) 有什么建议吗?比较两个Javascript关联数组,javascript,arrays,comparison,associative,Javascript,Arrays,Comparison,Associative,我在这里搜索了一种比较javascript中关联数组的高质量方法。我找到的唯一体面的解决方案是具有一些比较数组函数的项目。唯一的问题是,这些函数将第一个数组视为第二个数组的密钥。在我的情况下,至少两个数组并不总是具有相同的键或相同的键。这会导致函数输出的结果不包括array1中可能不存在但array2中存在的键。到目前为止,我唯一能想到的是在参数翻转的情况下运行array_diff_associative()函数两次,然后将它们组合起来(这似乎有问题,因为第一个参数再次用作第二个参数的键) 有什
谢谢。我认为以下几点可以满足您的要求:
function nrKeys(a) {
var i = 0;
for (key in a) {
i++;
}
return i;
}
function compareAssociativeArrays(a, b) {
if (a == b) {
return true;
}
if (nrKeys(a) != nrKeys(b)) {
return false;
}
for (key in a) {
if (a[key] != b[key]) {
return false;
}
}
return true;
}
我真的不知道是否有比暴力方法更好的方法:
function differences(a, b){
var dif = {};
for(key in a){ //In a and not in b
if(!b[key]){
dif[key] = a[key];
}
}
for(key in a){ //in a and b but different values
if(a[key] && b[key] && a[key]!=b[key]){
//I don't know what you want in this case...
}
}
for(key in b){ //in b and not in a
if(!a[key]){
dif[key] = b[key];
}
}
return dif;
}
此外,它们是对象,而不是数组,并且某些属性无法通过for..in枚举(例如,像Array.length),因此在应用程序中要考虑到这一点。这是一个老问题,但由于它是在谷歌搜索比较数组时首先出现的,我想我会加入一个替代的解决方案,即使在数组中有两个具有相同值的不同对象时也可以使用
function arrays_equal(a, b) {
return JSON.stringify(a) == JSON.stringify(b);
}
注意:这取决于顺序,因此如果顺序无关紧要,您总是可以提前进行排序。只是想知道,您的第一次比较compareAssociativeArrays是否应该是if(a==b)?您的解决方案有两个缺点:(1)当a和b的大小相同时,它会错误地返回true,a有一个指向未定义值的键,而b没有该键。(2) 如果a和b中存在两个值,它们具有相同的值,但实际上是对象,并且通过“==”运算符不相等,那么它将错误地返回false。虽然修复(1)很容易,但修复(2)需要更多的努力。作为另一种解决方案,我会使用一个toString(),甚至更快的join(“”)方法来比较两个字符串。一个被报道的缺点是,我已经更新了这个函数:尽管这个问题非常古老,但它可能对某些人有用。