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

问题描述:

我有一个比较函数,用于检查用户是否更改了像这样的对象中的任何属性值。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))); 

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

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

+0

你使用的是什么版本的lodash? – Meir

+0

@Meir使用版本4.17.4 – Nicolas

+0

您想比较这两个对象中属性名称的存在性还是这些属性的值?如果我没有弄错,现在是第一个。 – Philipp

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

该函数将返回每一个被改变的关键。梅尔解决方案不适合我。他的解决方案将返回任何数组值是否没有改变。所以,我已经调整了一下

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