Lodash - 显示对象的已更改属性

时间:2017-05-05 11:45:33

标签: javascript angular typescript lodash

我有一个比较函数,用于检查用户是否更改了对象中的任何属性值。

private checkForChanges(): boolean {
    if (_.isEqual(this.definitionDetails, this.originalDetails) === true) {
        return false;
    } else {
        return true;
    }
}

这很好用,但是现在我想console.log更改如果有任何更改,哪些属性会被更改。

我试过这个:

console.log(_.difference(_.keys(this.originalDetails), _.keys(this.definitionDetails)));

但我总是得到[]所以我认为我的语法错了。

实现我想要的正确方法是什么?

2 个答案:

答案 0 :(得分:3)

如果值发生变化,_.isEqual可能会返回false,即使密钥保持不变也会发生这种情况。

例如:{x: 11, y: 12}, and {x: 11, y: 13}将返回false,尽管它们仍然具有相同的键。

您的_.difference()比较了这些键。

要获得更改的密钥,您需要实现自己的功能:

function changedKeys(o1, o2) {
  var keys = _.union(_.keys(o1), _.keys(o2));
  return _.filter(keys, function(key) {
    return o1[key] !== o2[key];
  }
}

答案 1 :(得分:2)

此函数将返回每个已更改的键。 Meir解决方案对我不起作用。他的解决方案将返回任何数组值,无论是否更改。所以,我稍微调整了一下

function(o1, o2) {
  var keys = _.union(_.keys(o1), _.keys(o2));
  return _.filter(keys, function(key) {
    return !_.eq(o1[key].toString(), o2[key].toString());
  })
}