2011-09-05 21 views
0

"オブジェクトリテラル"の配列から "オブジェクトリテラル"を削除する最も一般的な方法論(おそらくJavaScript)は何ですか?削除されるオブジェクトのインデックスは次のとおりです。オブジェクトリテラルの配列からオブジェクトリテラルを削除するには

キーは同じで、値だけが変更できます。

我々は

arrObj = [{k: "a"},{k: "b"},{k: "c"},{k: "d"}]; //{k: "a"} 

があるとしますがojectリテラルのほんの一例ですが、各オブジェクトは、より多くの私が可能な関数リテラルを定義するこの

{k: "a", {y: {z: "c"}} } 

のように入れ子にすることができ

var removeObjFromArray = function (obj){ ... };  
arrObj.removeObjFromArray({k: "b"}); // {k: "a"},{k: "c"},{k: "d"} 
+2

"オブジェクトリテラルの配列"はありません。あなたはオブジェクトの配列を持っています。各オブジェクトはオブジェクトリテラルから作成されました。これは字句表記で、コードに入力した文字のシーケンス、つまり "リテラル"です。 –

+2

関数リテラルとは何ですか? –

答えて

1

あなたがしていることは何でもできるはずです。ここで必要なソリューションを実現するには、アレイ全体を反復処理する必要があります。を次にオブジェクトを比較します。 1つの解決策は、JSONを使用することですが、compatibility shimを必要とする古いブラウザではパフォーマンスが低下します。これは、関数を比較する必要がない場合に実行可能なソリューションに過ぎません。このような何か作業をする必要があります:

function removeFromArray(arr, obj) { 
    obj = JSON.stringify(obj); 
    for (var i=0, max = arr.length; i < max; i++) { 
     if (JSON.stringify(arr[i]) === obj) 
      arr.splice(i, 1); 
    } 
} 

の作業例:コメントで言及cdhowieとして、繰り返しの順序はJSONオブジェクトのプロパティを持つ要因である、ということhttp://jsfiddle.net/4JmzV/

注意を同じ順序で定義する必要があります。しかし、JSONがなければ、各オブジェクトのキーを反復する必要があります。は、引数に渡されたオブジェクトを何度も繰り返して、両方のオブジェクトに同じキーと同じ値が含まれていることを確認します。ネイティブJSON

私が最初の文章で言ったように、「あなたがやっていることは何でもやっている方がずっと良い方法があります」、あなたのアプローチをもう一度見直す方が良いかもしれません。

+0

'JSON.stringify()'は、キーと値のペアが出力文字列に現れる順序を保証しますか?順序が予測できない場合、このコードは、それ以外の点で同一のオブジェクトで失敗する可能性があります。 – cdhowie

+0

@cdhowie:互換性の実装では、ほとんどのブラウザでオブジェクトキーが同じ順序で定義されている必要があります。ネイティブ実装に関しては、わかりませんが、同じことが当てはまると思います。いずれにせよ、それは良い点であり、適切な実装の前に少し研究する必要があります。オブジェクトを比較するのがはるかに複雑になるので、まだまともな解決策だと私は考えています。しかし、私は、OPがこれを完全に行い、彼の問題を解決するためのよりよいアプローチを取る必要を回避できる可能性が高いと思います。 –

+0

。キーの順序付けが定義されていれば良いアプローチです。 – cdhowie

0

2つのオブジェクトが「同じ」ときに定義する必要があります。あなたの例では、removeObjFromArrayの引数は、実際には、各リテラル構文が別個のオブジェクトを作成するため、配列内のオブジェクトとは異なるオブジェクト(参照によって比較される)です。

「k」という名前のキーが常にあることがわかっている場合は、それを比較できますが、もっと一般的な解決策を探していると思いますか?

同じ値(オブジェクトの場合は再帰的に比較)で同じプロパティを持つ場合、2つのオブジェクトが同じであると判断できます。しかし、それは本当にあなたのプログラムのユースケースに依存します。

関連する問題