js判断两个对象相等的方法

一、 JSON.stringify 方法

JSON.stringify(object1) === JSON.stringify(object2);

这个方法只适用于完全相同的,即键-值顺序都完全对应的对象。一般情况下,用这种方法就够了。

二、ES6 Object.entries 方法

Object.entries(object1).toString() === Object.entries(object2).toString();

Object.entries() 方法返回一个给定对象自身可枚举属性的键值对数组,其排列与使用 for…in 循环遍历该对象时返回的顺序一致(区别在于 for-in 循环还会枚举原型链中的属性)。

但是,对于键-值一样,但顺序不一样的对象,可以采用下面的方法。

三、Object.keys() 方法

Object.keys() 方法会返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和正常循环遍历该对象时返回的顺序一致 。

// array like object
var obj = { 0: 'a', 1: 'b', 2: 'c' };
console.log(Object.keys(obj)); // console: ['0', '1', '2']

下面是一个完整的自定义方法。

// 列出所有的键,接着遍历数组
function ifCompare(object1, object2) {
    var o1keys = Object.keys(object1);
    var o2keys = Object.keys(object2);
    if (o2keys.length !== o1keys.length) return false;
    for (let i = 0; i <= o1keys.length - 1; i++) {
        let key = o1keys[i];
        if (!o2keys.includes(key)) return false;
        if (object2[key] !== object1[key]) return false;
    }
    return true;
}

如果你想获取一个对象的所有属性,,甚至包括不可枚举的,请使用Object.getOwnPropertyNames。

四、Object.getOwnPropertyNames() 方法

Object.getOwnPropertyNames()方法返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性但不包括 Symbol 值作为名称的属性)组成的数组。

如果你只要获取到可枚举属性,使用 Object.keys 或用 for…in 循环(还会获取到原型链上的可枚举属性,不过可以使用 hasOwnProperty() 方法过滤掉)。

let obj1 = {
    a: 1,
    b: {c: 2}
};

let obj2 = {
    b: {c: 3},
    a: 1
};

function isObjectValueEqual(a, b) {
    // 判断两个对象是否指向同一内存,指向同一内存返回 true
    if (a === b) return true; // 获取两个对象键值数组

    let aProps = Object.getOwnPropertyNames(a);
    let bProps = Object.getOwnPropertyNames(b);
    // 判断两个对象键值数组长度是否一致,不一致返回 false
    if (aProps.length !== bProps.length) return false; // 遍历对象的键值

    for (let prop in a) {
        // 判断 a 的键值,在 b 中是否存在,不存在,返回 false
        if (b.hasOwnProperty(prop)) {
            // 判断 a 的键值是否为对象,是则递归,不是对象直接判断键值是否相等,不相等返回 false
            if (typeof a[prop] === 'object') {
                if (!isObjectValueEqual(a[prop], b[prop])) return false;
            } else if (a[prop] !== b[prop]) {
                return false;
            }
        } else {
            return false;
        }
    }
    return true;
}

console.log(isObjectValueEqual(obj1, obj2)); // false

上面代码的思路是:要遍历对象的所有键名和键值是否都一致。

  1. 判断两个对象是否指向同一内存。
  2. 使用 Object.getOwnPropertyNames 获取对象所有键名数组。
  3. 判断两个对象的键名数组是否相等。
  4. 遍历键名,判断键值是否都相等 。

相关文章:js判断两个数组相等的方法


已发布

分类

来自

标签: