如何使用Lodash深度比较两个结构相同的对象是否相等
深度对比结构相同对象的正确实现
你现在用的isArrayEqual函数是专门用来对比数组的,直接拿来对比对象肯定不行——因为Lodash把对象传入_()后,会转换成键值对数组(比如[{key: 'list', value: {...}}, ...]),这时候xorWith的对比逻辑完全偏离了你要的对象属性深度对比。
其实要深度对比两个结构相同的对象,Lodash的_.isEqual本身就支持全属性的深度校验,包括嵌套对象、数组、空对象这些场景都能处理。
正确的对象深度对比函数
如果要封装成函数,直接基于_.isEqual就行:
export const isObjectDeepEqual = (x, y) => { return _.isEqual(x, y); };
验证你的示例对象
拿你给出的obj1和obj2来说,_.isEqual会检测出两处差异:
list.text_list:obj1是"RESPUESTA CON LSITA 2",obj2是"RESPUESTA Editada"list.items_list[1].title_item:obj1是"Respuesta 3",obj2是"Respuesta 5"
调用isObjectDeepEqual(obj1, obj2)会返回false,完全符合预期。
如果你确实要对比数组(比如对象数组)
要是你的场景是对比两个包含对象的数组,那你原来的isArrayEqual其实是有效的——因为_.xorWith结合_.isEqual会深度对比数组中的每个对象元素,返回空数组就说明两个数组的元素(包括嵌套属性)完全一致。比如对比两个结构相同的对象数组:
const arr1 = [obj1, {a: 1}]; const arr2 = [obj1, {a: 1}]; isArrayEqual(arr1, arr2); // 返回true
内容的提问来源于stack exchange,提问作者ddaudiosolutions
相关产品推荐
相关产品推荐

