如何用lodash对2个对象进行深入比较?

2022-08-29 23:17:31

我有2个不同的嵌套对象,我需要知道它们是否在嵌套属性之一中有所不同。

var a = {};
var b = {};

a.prop1 = 2;
a.prop2 = { prop3: 2 };

b.prop1 = 2;
b.prop2 = { prop3: 3 };

该对象可能更复杂,具有更多嵌套属性。但这个就是一个很好的例子。我可以选择使用递归函数或带有lodash的东西...


答案 1

一个简单而优雅的解决方案是使用 _.isEqual,它执行深度比较:

var a = {};
var b = {};

a.prop1 = 2;
a.prop2 = { prop3: 2 };

b.prop1 = 2;
b.prop2 = { prop3: 3 };

console.log(_.isEqual(a, b)); // returns false if different
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

但是,此解决方案不会显示哪个属性不同。


答案 2

如果你需要知道哪些属性是不同的,请使用 reduce()

_.reduce(a, function(result, value, key) {
    return _.isEqual(value, b[key]) ?
        result : result.concat(key);
}, []);
// → [ "prop2" ]