【问题标题】:Lodash - Show changed properties of objectLodash - 显示对象的更改属性
【发布时间】:2017-05-05 11:45:32
【问题描述】:

我有一个比较函数,可以检查用户是否像这样更改了 objects 中的任何属性值。

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

这很好用,但是现在我想控制台记录更改,如果有任何更改,则更改了哪个属性。

我试过这个:

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

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

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

【问题讨论】:

  • 你使用的是什么版本的 lodash?
  • @Meir 使用版本 4.17.4
  • 你想比较这两个对象中是否存在属性名,还是这些属性的值?如果我没记错的话,现在是第一个。
  • @Philipp 我想比较值(我知道属性存在,用户只能更改它的值)。
  • 你需要使用 lodash 吗?

标签: javascript angular typescript lodash


【解决方案1】:

如果值更改,_.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];
  });
}

【讨论】:

    【解决方案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());
      })
    }
    

    【讨论】:

    • 糟糕...不考虑空值。请改用:return !_.eq(_.toString(o1[key]), _.toString(o2[key]));(请记住,空值和空字符串在这种方法中将被视为等效)。
    • @JohnRix 这种方法不适用于为我返回 null 的属性。所以,我尝试使用这种方法,例如那些为字符串返回“null”的值
    猜你喜欢
    • 2022-01-14
    • 2018-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-12
    相关资源
    最近更新 更多