我在这里搜索了一个质量方法来比较javascript中的关联数组。我找到的唯一合适的解决方案是PHP.JS项目,它具有一些比较数组函数。唯一的问题是这些函数将第一个数组视为第二个数组的关键。在我的情况下,至少两个数组并不总是具有相同的键数和相同的键。这会导致函数输出不包含array1中可能不存在但在array2中存在的键的结果。到目前为止,我唯一能想到的就是在翻转参数的情况下运行array_diff_associative()函数两次然后将它们组合起来(这似乎有问题,因为第一个参数再次被用作第二个参数的键)。
有什么建议吗? 谢谢。
答案 0 :(得分:8)
这是一个老问题,但是因为它首先出现在谷歌搜索比较数组中,我想我会投入一个替代解决方案,即使数组有两个具有相同值的不同对象也能正常工作。
function arrays_equal(a, b) {
return JSON.stringify(a) == JSON.stringify(b);
}
注意:这取决于订单,因此如果订单无关紧要,您可以随时提前排序。
答案 1 :(得分:7)
我认为以下内容应该符合您的要求:
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;
}
答案 2 :(得分:2)
我真的不知道是否有比蛮力方法更好的方法:
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),因此请将其考虑在内。