如何做两个对象与lodash深入比较?
我有2个不同的嵌套对象,我需要知道他们的嵌套属性是否有差异。
var a = {};
var b = {};
a.prop1 = 2;
a.prop2 = { prop3: 2 };
b.prop1 = 2;
b.prop2 = { prop3: 3 };
对象可能更复杂,嵌套属性更多。 但这是一个很好的例子。 我可以选择使用递归函数或lodash ...
一个简单而优雅的解决方案是使用_.isEqual
进行深入比较:
var a = {};
var b = {};
a.prop1 = 2;
a.prop2 = { prop3: 2 };
b.prop1 = 2;
b.prop2 = { prop3: 3 };
_.isEqual(a, b); // returns false if different
但是,此解决方案不显示哪个属性不同。
http://jsfiddle.net/bdkeyn0h/
如果您需要知道哪些属性不同,请使用reduce():
_.reduce(a, function(result, value, key) {
return _.isEqual(value, b[key]) ?
result : result.concat(key);
}, []);
// → [ "prop2" ]
对于任何人绊倒这个线程,这是一个更完整的解决方案。 它将比较两个对象,并为您提供所有属性的关键字,这些属性仅在object1中 , 仅在object2中 ,或者在object1和object2中都有,但具有不同的值 :
/*
* Compare two objects by reducing an array of keys in obj1, having the
* keys in obj2 as the intial value of the result. Key points:
*
* - All keys of obj2 are initially in the result.
*
* - If the loop finds a key (from obj1, remember) not in obj2, it adds
* it to the result.
*
* - If the loop finds a key that are both in obj1 and obj2, it compares
* the value. If it's the same value, the key is removed from the result.
*/
function getObjectDiff(obj1, obj2) {
const diff = Object.keys(obj1).reduce((result, key) => {
if (!obj2.hasOwnProperty(key)) {
result.push(key);
} else if (_.isEqual(obj1[key], obj2[key])) {
const resultKeyIndex = result.indexOf(key);
result.splice(resultKeyIndex, 1);
}
return result;
}, Object.keys(obj2));
return diff;
}
以下是一个输出示例:
// Test
let obj1 = {
a: 1,
b: 2,
c: { foo: 1, bar: 2},
d: { baz: 1, bat: 2 }
}
let obj2 = {
b: 2,
c: { foo: 1, bar: 'monkey'},
d: { baz: 1, bat: 2 }
e: 1
}
getObjectDiff(obj1, obj2)
// ["c", "e", "a"]
如果您不关心嵌套对象并想跳过lodash,则可以用_.isEqual
替换正常值比较,例如obj1[key] === obj2[key]
。
上一篇: How to do a deep comparison between 2 objects with lodash?