js 比较两个对象的值是否相等
在JavaScript中,比较两个对象是否相等通常涉及到几个关键点。直接比较两个对象的引用(即使用==
或===
)通常不会比较它们的值,除非它们指向同一个内存地址(即同一个对象实例)。要比较两个对象的值是否相等,就需要逐个比较它们的属性。
方法1:浅比较(不考虑嵌套对象)
如果只需要比较对象的顶层属性,可以使用以下方法:
function areObjectsEqual(obj1, obj2) {const keys1 = Object.keys(obj1);const keys2 = Object.keys(obj2);if (keys1.length !== keys2.length) {return false;}for (let key of keys1) {if (obj1[key] !== obj2[key]) {return false;}}return true;
}const obj1 = { a: 1, b: 2 };
const obj2 = { a: 1, b: 2 };
const obj3 = { a: 1, b: 3 };console.log(areObjectsEqual(obj1, obj2)); // true
console.log(areObjectsEqual(obj1, obj3)); // false
方法2:深比较(考虑嵌套对象)
如果需要比较嵌套对象,可以使用递归或使用库函数如lodash
的isEqual
函数:
function deepEqual(x, y) {if (x === y) {return true;}if (typeof x !== 'object' || x === null ||typeof y !== 'object' || y === null) {return false;}const keysX = Object.keys(x);const keysY = Object.keys(y);if (keysX.length !== keysY.length) {return false;}for (let key of keysX) {if (!keysY.includes(key) || !deepEqual(x[key], y[key])) {return false;}}return true;
}const obj4 = { a: 1, b: { c: 2 } };
const obj5 = { a: 1, b: { c: 2 } };
const obj6 = { a: 1, b: { c: 3 } };console.log(deepEqual(obj4, obj5)); // true
console.log(deepEqual(obj4, obj6)); // false
使用插件lodash的isEqual
:
const _ = require('lodash');const obj7 = { a: 1, b: { c: 2 } };
const obj8 = { a: 1, b: { c: 2 } };
const obj9 = { a: 1, b: { c: 3 } };console.log(_.isEqual(obj7, obj8)); // true
console.log(_.isEqual(obj7, obj9)); // false
最后:
选择哪种方法取决于具体需求。对于简单的场景,浅比较就足够了。如果需要处理嵌套对象或复杂的数据结构,建议使用深比较或lodash
的isEqual
函数。这样可以确保所有层级的属性都被正确比较。