2017-05-05 10 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 version 4.17.4を使用 – Nicolas

+0

これら2つのオブジェクトのプロパティ名の存在またはこれらのプロパティの値を比較しますか?私が間違っていなければ、今は最初のものです。 – 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

この関数は、変更されたすべてのキーを返します。 Meirの解決策は私のために働かなかった。彼のソリューションは変更されていないかどうかに関わらず、配列の値を返します。だから、私は少しそれを微調整しました

function(o1, o2) { 
    var keys = _.union(_.keys(o1), _.keys(o2)); 
    return _.filter(keys, function(key) { 
    return !_.eq(o1[key].toString(), o2[key].toString()); 
    }) 
} 
関連する問題