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)));
,但我总是得到[]
所以我想我的语法是错误的。
什么是实现我想要的正确方法?
答
如果值更改,_.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());
})
}
你使用的是什么版本的lodash? – Meir
@Meir使用版本4.17.4 – Nicolas
您想比较这两个对象中属性名称的存在性还是这些属性的值?如果我没有弄错,现在是第一个。 – Philipp