2

私は2つの配列oldArrayとを持っていnewArrayます。新しい値が入力されたら、新しい値と比較して引き出しnewArrayたいと思います。oldArray

これらの配列では、ハッシュを格納しています。

例えば。

oldArray = []
newArray = [{"one": 1}]

新しい要素を見つける必要があります。{"one": 1}

underscore.jsを使用すると、次のようなことができます。

newElement = _.difference(newValue, oldValue)

これは最初は問題なく機能しますが、戻って配列にさらに追加すると、次のようになります。

oldArray = [{"one": 1}]
newArray = [{"one": 1},{"two": 2}]

そして同じことをする newElement = _.difference(newValue, oldValue)

新しいオブジェクトとして戻って[{"one": 1},{"two": 2}]きます...値ではなくオブジェクトを比較しているためですか?これを行うためのより良い方法はありますか?

上記は例ですが、私のアプリからこれをコンソールから取得しました

oldValue map.js:85
[Object]
0: Object
$$hashKey: "007"
address: "england"
latLng: GeoCode
__proto__: Object
length: 1
__proto__: Array[0]

newValue map.js:83
[Object, Object]

0: Object
$$hashKey: "007"
address: "england"
latLng: GeoCode
__proto__: Object

1: Object
$$hashKey: "009"
address: "france"
latLng: GeoCode
__proto__: Object
length: 2
__proto__: Array[0]

これら2つを比較すると、次のようになります。

[Object, Object]
0: Object
$$hashKey: "007"
address: "england"
latLng: GeoCode
__proto__: Object

1: Object
$$hashKey: "009"
address: "france"
latLng: GeoCode
__proto__: Object
length: 2
__proto__: Array[0]

現在、このプロジェクトではAngularJSとUnderscoreを使用しています。

たぶん、これを行う方がはるかに良いでしょう。その配列から「異なる」オブジェクトを引き出す必要があります。だから私はそれを使って何か他のことをすることができます。常に最後の要素になるとは限りません。

アップデート

JavaScript Array Set Mathematics Libraryも試して使用.substractしましたが、同じ結果になりました。これは、ハッシュが変化していることを意味しているに違いありませんが、私にはそのようには見えません

これらを取得するためにoldArraynewArray私はAngular$watchを使用しています。

4

2 に答える 2

1

が常に一意である場合$$hashKeyは、2つのオブジェクトを作成し、ハッシュのキーをそれらにすることができます$$hashKey

newObject[myObject["$$hashKey"]] = myObject;

それで

var difference = _.omit(newObject, _.keys(oldObject));

newObjectにはあったが、古いものにはなかったキーと値のペアのみを含むオブジェクトを提供します。

一意のキーがない場合、あまり便利ではない方法は、オブジェクトを文字列にシリアル化および逆シリアル化してから、を使用すること_.differenceです。

于 2013-02-24T16:27:18.437 に答える
0

少し前に、似たようなAngularJSチャレンジに遭遇しました。これを管理する方法について絶対的な最善の答えをあなたに与えることができるかどうかはわかりませんが、これが私のために働いたと言えることです:

まず、$watchを正しく使用していることを確認してください。3つのパラメータが必要です。

  • watchExpression – {(function()| string)} –$digestサイクルごとに評価される式。戻り値を変更すると、リスナーへの呼び出しがトリガーされます。文字列:式として評価function(scope):現在のスコープをパラメーターとして呼び出されます。
  • listener(optional)– {(function()| string)=} –watchExpressionの戻り値が変更されるたびにコールバックが呼び出されます。文字列:式として評価function(newValue、oldValue、scope):現在および以前の値をパラメーターとして使用して呼び出されます。
  • objectEquality(optional) – {boolean =} –参照ではなく、オブジェクトが等しいかどうかを比較します。

最後の部分は特に重要です。あなたはあなたのケースでobjectEqualityを監視したいので、必ず次のように$watchを使用してください。

$scope.$watch('watchObject', fn({}), true);

true上記の3番目のパラメータとしての使用に注意してください。詳細については、AngularScopeDocsをご覧ください。

2番目:Angularオブジェクトを比較する場合、$$hashKeysの比較に関する答えは非常に理にかなっていると思います。何を返したいかに応じて、独自のdiff関数を作成することも検討してください。違いを返したいが、基本的なオブジェクトの差分のみを見ている場合は、jQueryobjectDiffのようなものを試してください

3番目:オブジェクトをネストされたオブジェクトやその中の配列と比較したい場合、物事は難しくなります。私はそうするための最適化されていない方法を書きました、そしてあなたがそれを必要とするならば、私は喜んでもっと光を当てます。

幸運を!

于 2013-02-24T16:41:08.043 に答える