一、 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
上面代码的思路是:要遍历对象的所有键名和键值是否都一致。
- 判断两个对象是否指向同一内存。
- 使用 Object.getOwnPropertyNames 获取对象所有键名数组。
- 判断两个对象的键名数组是否相等。
- 遍历键名,判断键值是否都相等 。
相关文章:js判断两个数组相等的方法