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

新手上路,请多包涵

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

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

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

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

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

原文由 JLavoie 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.4k
2 个回答

一个简单而优雅的解决方案是使用 _.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>

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

原文由 JLavoie 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

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

原文由 Adam Boduch 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题