1

Javascript 初心者はこちら --

次の配列があります。

var group = ({ 
        one: value1,
        two: value2,
        three: value3
    });

配列「グループ」が「groupsArray」の一部であるかどうかを確認し、含まれていない場合は追加するか、含まれている場合は削除します。

var groupLocate = $.inArray(group, groupsArray);
if(groupLocate ==-1){
        groupsArray.push(group);
        } else {
        groupsArray.splice($.inArray(group, groupsArray),1);
        }

このメソッドは、単一値配列で機能します。残念ながら、この場合、groupLocate は常に -1 を返すため、3 つのキーと値で機能させることはできません。

私は何を間違っていますか?

ありがとう。

4

1 に答える 1

2

$.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たとえば、groupisの場合、配列内の であっ{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 にはディープ コピー機能はありませんが、必要に応じて記述できます。)

于 2013-04-05T17:35:57.120 に答える