2017-05-05 35 views
0

我有一個比較函數,用於檢查用戶是否更改了像這樣的對象中的任何屬性值。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

回答

2

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

該函數將返回每一個被改變的關鍵。梅爾解決方案不適合我。他的解決方案將返回任何數組值是否沒有改變。所以,我已經調整了一下

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