JavaScript中嵌套对象比较:递归返回键相等性标识对象
递归比较嵌套对象并生成相等性标识对象
要实现你需要的功能,我们可以写一个递归函数,遍历两个对象的所有键(包括各自独有的属性),对每个键对应的值进行比较:如果是嵌套对象就递归处理,否则直接判断值是否相等。下面是具体的实现方案:
实现思路
- 先收集两个对象的所有唯一键,确保不会漏掉任何一方新增的属性
- 对每个键分别处理:
- 如果两个对象中该键的值都是非null的对象,就递归调用比较函数
- 否则直接用
===判断两个值是否相等(类型和值都一致才返回true)
- 对于只有一方存在的键,直接返回false
代码实现
function deepCompareEquality(obj1, obj2) { // 获取两个对象的所有键,去重得到唯一键集合 const allKeys = new Set([...Object.keys(obj1), ...Object.keys(obj2)]); const result = {}; for (const key of allKeys) { const val1 = obj1[key]; const val2 = obj2[key]; // 判断是否都是非null的对象 const isObj1 = typeof val1 === 'object' && val1 !== null; const isObj2 = typeof val2 === 'object' && val2 !== null; if (isObj1 && isObj2) { // 递归处理嵌套对象 result[key] = deepCompareEquality(val1, val2); } else { // 直接比较值,不存在的键会被视为undefined,和存在的值比较必然不等 result[key] = val1 === val2; } } return result; }
测试示例
用你给出的例子来验证:
const obj1 = { prop1: 1, prop2: "foo", prop3: { prop4: 2, prop5: "bar" } }; const obj2 = { prop1: 3, prop2: "foo", prop3: { prop4: 2, prop5: "foobar" }, prop6: "new" }; const equality = deepCompareEquality(obj1, obj2); console.log(equality);
输出结果完全符合你的预期:
{ prop1: false, prop2: true, prop3: { prop4: true, prop5: false }, prop6: false }
补充说明
- 这个函数默认只处理普通对象,如果需要支持数组的比较,可以在判断对象类型时加入
Array.isArray()的判断,调整递归逻辑即可 - 使用
===进行值比较,确保类型和值都一致才返回true,比如1和"1"会被判定为不相等
内容的提问来源于stack exchange,提问作者loretoparisi
相关产品推荐
相关产品推荐

