比较两个对象数组

Comparing two array of objects

本文关键字:两个 对象 数组 比较      更新时间:2023-09-26

我正在尝试比较两个对象数组。下面是我的代码。

var result = identical([
    {"depid": "100", "depname": ""},
    {"city": "abc", "state": "xyz"},
    {"firstName": "John", "lastName": "Doe", "contactno": {"ph": 12345, "mob": 485428428}}
], [
    {"firstName": "John", "lastName": "Doe", "contactno": {"ph": 12345, "mob": 485428428}},
    {"depid": "100", "depname": ""},
    {"city": "abc", "state": "xyz"}
]);
console.log(result); // returns false
function identical(a, b) {
    function sort(object) {
      if (typeof object !== "object" || object === null) {
            return object;
        }
        return Object.keys(object).sort().map(function (key) {
            return {
                key: key,
                value: sort(object[key])
            };
        });
    }
    return JSON.stringify(sort(a)) === JSON.stringify(sort(b));
};

我想知道为什么在比较上面两个对象数组时得到的结果是false。

如果我通过下面的对象,结果是真实的

var result = identical([
    {"firstName": "John", "lastName": "Doe", "contactno": {"ph": 12345, "mob": 485428428}},
    {"depid": "100", "depname": ""},
    {"city": "abc", "state": "xyz"}
], [
    {"firstName": "John", "lastName": "Doe", "contactno": {"ph": 12345, "mob": 485428428}},
    {"depid": "100", "depname": ""},
    {"city": "abc", "state": "xyz"}
]);

如何在不查看对象顺序的情况下仅基于关键字进行比较?

我找到的解决方案之一是定义一个函数来测试对象的相等性,然后需要为数组上的每个元素调用该函数。这个代码对我来说很好:

Object.prototype.equals = function(x) {
        for(p in this) {
            switch(typeof(this[p])) {
                    case 'object':
                            if (!this[p].equals(x[p])) { return false }; break;
                    case 'function':
                            if (typeof(x[p])=='undefined' || (p != 'equals' && this[p].toString() != x[p].toString())) { return false; }; break;
                    default:
                            if (this[p] != x[p]) { return false; }
            }
        }
        for(p in x) {
            if(typeof(this[p])=='undefined') {return false;}
        }
        return true;
    }

来源:JavaScript 中的对象比较

    function identical (arr1, arr2) {
        if(arr1.length != arr2.length) {
            return false;
        }
        var exists = arr1.length;
        for(var i = 0; i<arr1.length; i++) {
            for(var j =0; j<arr2.length ; j++) {
                if(Object.keys(arr1[i]).equals(Object.keys(arr2[j]))) {
                   exists--;
                }
            }
        }
        return !exists;
    }

现在这个代码的结果是true

var result = identical([
    {"firstName": "John", "lastName": "Doe", "contactno": {"ph": 12345, "mob": 485428428}},
    {"depid": "100", "depname": ""},
    {"city": "abc", "state": "xyz"}
], [
    {"firstName": "John", "lastName": "Doe", "contactno": {"ph": 12345, "mob": 485428428}},
    {"depid": "100", "depname": ""},
    {"city": "abc", "state": "xyz"}
]);

编辑:

要只比较密钥,您需要使用:

Object.keys(arr1[i]).equals(Object.keys(arr2[j])

而不是

arr1[i].equals(arr2[j])

我对上面的代码进行了更新。

在序列化对象以字符串时,不能保证键的顺序相同。要进行比较而不考虑顺序,请检查此比较两个json数组

它失败是因为a是一个数组,所以sort(a)根据数组索引对a进行排序。你可以试试:

 var l = ['a','b'];
 alert(Object.keys(l));

它显示:

0,1

所以sort(a)sorts不会把对象按有意义的顺序放在里面。它甚至不关心数组中的内容。

如果你想比较对象数组,我建议对数组中的每个对象使用函数sort,然后对数组中每个对象进行jsonify,然后对字符串数组进行排序,并比较两个排序后的字符串数组。