var source1 = '[{"vConfig":{"vType":"objectview","serverItemType":"TrackerObject"}}]';
そして、これもJSonでシリアル化された別のJavaScriptオブジェクトです。
var source2 = '[{"vConfig":{"serverItemType":"TrackerObject","vType":"objectview"}}]';
それらは同じ構造、同じパラメーター、これらのパラメーターの同じ値を持っています。 すべての表示で、
source2
と
source2
同じことがあり
source2
。
しかし、もちろんJavaScriptインタープリターは私たちに同意しません。 そして彼は、source1とsource2は異なる文字列であると合理的に信じています。 そして、それらを逆シリアル化して戻すと、異なるメモリアドレスにある2つのオブジェクトを取得します...また、互いに等しくありません。
また、さらにExt.jsを使用して、クラスをrousしみなく生成し、jSonを忘れない場合、完全な日食に到達できます。 JSonsで収集されるコントロールに関するこれらの膨大な情報の比較方法は? または、各フィールドで他のサブフィールドがすでに再作成されているツリーのようなオブジェクトを整理しますか?
解決方法は1つしかありません。値ではなく、メモリ内のセルではなく、より柔軟に比較する方法を見つける必要があります。 Equalは、 同じフィールドに同じ値が含まれるオブジェクトと見なされる必要があります 。 この観点から、
source2
source1
間違いなく
source2
と等しくなり
source2
。
そして、次の自転車が生まれました-JSonCmp 。 JavaScriptでオブジェクトを比較するためのシンプルで非常に便利な関数。 もちろん、これを書くための多くの試みを見つけましたが、各実装は問題の一部のみを解決しました-結果として、私はすべての興味深いアイデアを1つにまとめ、同時に私のものをいくつか追加しました...
使い方は簡単です-jsoncmp.jsを接続してから呼び出します:
jSonCom(object1, object2);
オブジェクトに同じ情報が含まれている場合、関数はtrueを返します。 それ以外の場合、false。
Ext.jsユーザーは同じアルゴリズムを使用できますが、プラグインラッパー-jsoncmp.ext.jsで使用できます。 コードは次のようになります。
Ext.ux.util.Object(object1, object2);
比較規則は次のとおりです。
- nullはnull
- 異なるタイプのオブジェクトは等しくありません
- 値による変数(Float、Integer、Boolean)は値によって比較されます
- 文字列は値で比較されます
- シリアル化されたJSONは、逆シリアル化されたオブジェクトとして比較されます
- 関数は、文字列にキャストされたソースコードによって比較されます
- jQueryオブジェクトは、このライブラリの標準関数を使用して比較されます。
- オブジェクトはフィールドとその値によって比較されます。 フィールドの値にもオブジェクトがある場合-同じ原則に従って比較されます
- このツリーを横断するときに、シートが既に渡されたオブジェクトの1つを参照していることが判明した場合(これはツリー内にサイクルがあることを意味します)、オブジェクトへのリンクが比較されます。
- 配列は、要素の対応とその順序の両方について比較されます
- 検索設定でarrayAsSets = trueを設定すると、配列はセット(セット)として認識され、要素のシーケンスは無視されます。 検索設定は、3番目のオプションのパラメーターで設定されます。 このように:
jSonCmp([ 1, 2, 3, 4, 5 ], [ 1, 2, 3, 5, 4 ], { arraysAsSets : true })); # - true
デフォルトでは、arraysAsSetsはfalseに設定されています。
これが小さく、おそらく不完全な機能であることを願っていますが、作業を簡素化するでしょう。