首页 > 解决方案 > Lodash 4:如何比较两个对象键并返回差异?

问题描述

我有两个像这样的对象:

originalObj

{
    name: "Jane",
    fullName: "Jane Doe"
    nickname: "Janey"
    ...etc...
}

updatedObj

{
    name: "Jane",
    fullName: "Jane Dawn", //<--this value changed
    nickname: "Janey"
    ...etc..
}

使用 lodash 4,我如何比较两个对象并只返回带有键的更新值?

因此,例如,我希望看到:

{
    fullName: "Jane Dawn",
        ...etc...
}

我的用例是我想在提交到服务器之前向现有数据库数据和用户更新的表单数据的用户显示“之前”和“之后”视图。

标签: lodash

解决方案


如果它是平面对象,即没有嵌套对象或数组,则可以_.pickBy()在更新的对象上使用,并从原始对象中获取不等于相似属性的每个属性:

const originalObj = {"name":"Jane","fullName":"Jane Doe","nickname":"Janey"}
const updatedObj = {"name":"Jane","fullName":"Jane Dawn","nickname":"Janey"}

const result = _.pickBy(updatedObj, (v, k) => !_.isEqual(originalObj[k], v))

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js" integrity="sha512-WFN04846sdKMIP5LKNphMaWzU7YpMyCU245etK3g/2ARYbPK9Ub18eG+ljU96qKRCWh+quCY7yefSmlkQw1ANQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>

如果您需要比较嵌套对象,请使用包,例如deep-object-diff


推荐阅读