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