$.inArray()
まず、なぜうまくいかなかったのかを理解するのに役立ちます。もっと単純なケースを試してみましょう。jQuery が読み込まれたページ (このページなど) のブラウザの JavaScript コンソールにこれを貼り付けて実行します。
var object = { a: 1 };
var array = [ { a: 1 } ];
console.log( '$.inArray: ', $.inArray( object, array ) );
(用語に注意してください:group
変数はオブジェクトであり、配列ではありません。)
object
配列にあるように見えますよね?なぜ印刷されるの-1
ですか?これを試して:
console.log( object );
console.log( array[0] );
彼らは同じように見えます。どうですか:
console.log( '== or === works? ', object == array[0], object === array[0] );
またはさらに簡単です:
console.log( 'Does {a:1} == {a:1}? ', {a:1} == {a:1} );
console.log( 'What about {} == {}? ', {} == {} );
それらはすべて印刷されますfalse
!
これは、たまたま同じ内容を持つ 2 つのオブジェクトが 2 つの別個のオブジェクトであるためです。2 つのオブジェクトを比較するために==
orを使用する場合===
、それらが両方とも 1 つの同じオブジェクトへの参照であるかどうかを実際にテストしているためです。2 つの異なるオブジェクトがまったく同じ内容を含んでいたとしても、それらが等しく比較されることは決してありません。
$.inArray()
演算子を使用して 2 つのオブジェクトを比較するのと同じように機能します。同じ内容のオブジェクトだけでなく、同じオブジェクト===
でない限り、配列内のオブジェクトは見つかりません。
これを知っていれば、問題にアプローチする可能性のある方法を示唆していますか? 独自のコードを記述してオブジェクトの配列を検索する方法はいくつかあります。また、配列やオブジェクト用の便利なメソッドが多数あるUnderscore.jsなどのライブラリを使用すると便利な場合があります。
たとえば、最初の一致を見つけるために使用できますが、オブジェクト_.findWhere( groupsArray, group )
内のプロパティのみを比較することに注意してください。group
たとえば、group
isの場合、配列内の であっ{a:1}
たオブジェクトに一致します。groupsArray
{a:1,b:2}
完全一致が必要な場合は、アンダースコア_.find()
と_.isEqual()
メソッドを組み合わせることができます。
var index = _.find( groupsArray, function( element ) {
return _.isEqual( element, group );
});
最後にもう 1 つ注意事項があります。group
オブジェクトを配列にプッシュするコードgroupsArray
- 実際のgroup
オブジェクト自体をプッシュすることがわかっています。配列にコピーを作成するのではなく、まったく同じオブジェクトへの参照です。(皮肉なことに、これは、同じオブジェクトを自分で配列にgroup
プッシュした場合に、配列内で検索する元のコードが実際に機能することを意味します。)group
groupsArray
の要素がそれぞれ独自の独立したオブジェクトであり、コード内に浮かぶ別のオブジェクトへの参照ではないことを確認したい場合は、別の Underscore メソッドを使用して浅いコピーを行うことができます。
groupsArray.push( _.clone(group) );
ただし、ネストされたオブジェクトがある場合group
、これはそれらをコピーしません。(Underscore にはディープ コピー機能はありませんが、必要に応じて記述できます。)