【问题标题】:JavaScript (Lodash) - Deep comparison of two objectsJavaScript (Lodash) - 两个对象的深度比较
【发布时间】:2017-02-01 14:17:04
【问题描述】:

假设我有两个深层对象:

var oldData = {
  "id": 1,
  "first_name": "Eric",
  "last_name": "Henry",
  "info": {
    "email": "ehenry0@smh.com.au",
    "gender": "Male",
    "ip_address": "7.11.169.150",
    "age": 11
  }
};

var newData = {
  "id": 2,
  "first_name": "Tommy",
  "last_name": "Henry",
  "info": {
    "email": "tommy@ghenrry.com",
    "gender": "Male",
    "ip_address": "7.11.169.150",
    "age": 15
  }
};

我将如何使用 lodash(或 JavaScript)遍历每个对象并获取每个不同值的值,所以在最上面的情况下它会是

[
   {old: 1, new: 2},
   {old: 'Eric', new: 'Tommy'},
   {old: 'ehenry0@smh.com.au', new: 'tommy@ghenrry.com'},
   {old: 11, new: 15},
]

这是我目前所拥有的:

var oldData = {
  "id": 1,
  "first_name": "Eric",
  "last_name": "Henry",
  "info": {
    "email": "ehenry0@smh.com.au",
    "gender": "Male",
    "ip_address": "7.11.169.150",
    "age": 11
  }
};

var newData = {
  "id": 2,
  "first_name": "Tommy",
  "last_name": "Henry",
  "info": {
    "email": "tommy@ghenrry.com",
    "gender": "Male",
    "ip_address": "7.11.169.150",
    "age": 15
  }
};

var diffObj = _.difference(_.keys(oldData), _.keys(newData));

console.log(JSON.stringify(diffObj, null, 4));
<script src="https://cdn.jsdelivr.net/lodash/4.17.4/lodash.min.js"></script>

【问题讨论】:

标签: javascript


【解决方案1】:

使用自定义递归函数compareUserDataObject.keys()函数的解决方案:

var oldData = { "id": 1, "first_name": "Eric", "last_name": "Henry", "info": { "email": "ehenry0@smh.com.au", "gender": "Male", "ip_address": "7.11.169.150", "age": 11 }
}; 
var newData = { "id": 2, "first_name": "Tommy", "last_name": "Henry", "info": { "email": "tommy@ghenrry.com", "gender": "Male", "ip_address": "7.11.169.150", "age": 15 }
};

function compareUserData(oldData, newData, result) {
    Object.keys(oldData).forEach(function (k) {
        if (typeof oldData[k] !== 'object') {
            if (oldData[k] != newData[k]) this.push({'old': oldData[k], 'new': newData[k]});
        } else {
            compareUserData(oldData[k], newData[k], this);
        }
    }, result);

    return result;
}

var result = compareUserData(oldData, newData, []);
console.log(result);

【讨论】:

  • 谢谢,我能够根据这一理解创建自己的解决方案。
【解决方案2】:

您可能想要遍历您的对象属性,并手动检查是否有更改。 要了解如何迭代属性:Iterate through object properties

编辑:您的对象具有嵌套属性,请阅读这篇文章以了解如何检查它:How do I check if an object has a property in JavaScript?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-28
    • 2015-10-19
    • 2016-09-01
    • 2021-01-22
    相关资源
    最近更新 更多