2012-01-23 3 views
2

追加したいハッシュが含まれていない場合にのみ、配列にハッシュをプッシュする必要があります。 は、例えば、私はハッシュの配列を有する:javascriptハッシュのユニークな値

var someArray = [ 
     {field_1 : "someValue_1", field_2 : "someValue_2"}, 
     {field_1 : "someValue_3", field_2 : "someValue_4"}, 
     {field_1 : "someValue_5", field_2 : "someValue_6"} 
    ] 

そこに既に存在しているように

{field_1 : "someValue_1", field_2 : "someValue_2"} 

アレイにプッシュされるべきではない値が、値

{field_1 : "someValue_7", field_2 : "someValue_8"} 

べきであり、配列にそのような値が含まれていないためです。

jQueryを使用する方法はありますか?

今私はちょうど$ .eachループを使用して、配列にハッシュが含まれているかどうかを確認します。もしそうなら、私はフラグをトリガーします。しかし、私はこの解決策が嫌いです。

+0

したがって、複合ユニークインデックスを実装したいと思います。私は第二フェリックスの何を試しましたか?それぞれの追加に対して配列検索を行う必要があります。 'someArray'のデータはソートされていますか? (検索を簡略化する) – Rudu

+0

今私はちょうど$ .eachループを使用して、配列にハッシュが含まれているかどうかを確認します。もしそうなら、私はフラグをトリガーします。しかし、私はこの解決策が嫌いです。 – RomanKapitonov

+0

@Roman他の簡単なオプションは、コンポジットキーを使用してパラレルハッシュを保持することです。 –

答えて

2
  1. アレイ内のオブジェクトの存在を確認するカスタムプロトタイプを作成します。以下のプロトタイプデザインを確認してください。プロトタイプ上で使用
Array.prototype.contains=function(x){ 
for(i in this){ 
    if((x.field_1==this[i].field_1)&&(x.field_2==this[i].field_2)) 
    return true; 
} 
return false; 
} 
  1. 、あなたは配列であれば、オブジェクトの存在を確認することができます。
var someArray = [ 
     {field_1 : "someValue_1", field_2 : "someValue_2"}, 
     {field_1 : "someValue_3", field_2 : "someValue_4"}, 
     {field_1 : "someValue_5", field_2 : "someValue_6"} 
    ]; 

var a1={field_1 : "someValue_1", field_2 : "someValue_2"}; 
var a2={field_1 : "someValue_7", field_2 : "someValue_8"}; 

if(!someArray.contains(a1)) someArray.push(obj); // it will NOT BE pushed 
if(!someArray.contains(a2)) someArray.push(obj); // it will be pushed 
+0

コードブロックを再フォーマットできますか?コードブロックで編集したことを確認してください。ありがとうございました:) –

+0

配列にプッシュする前に存在をチェックするか、オブジェクトを含んでいない場合は配列にオブジェクトを追加してください。どちらも同じ目的を果たします:) –

+0

+1私の同意はあなたの後に来ました。私が提出を打つとき、私は "新しい答え"の通知を見た。 –

0

私はこの問題に長時間遭遇しました。私が常にやることは、要素が指定された要素のセットにある場合にtrueを返す関数を書くことです。

function IsElementInSet(Element,Set) 
{ 
    var ElementIsInSet=false; 

    for(var i=0;i<Set.length;i++) 
    { 
     if(Set.field_1==Element.field_1&&Set.field_2==Element.field_2) 
     { 
       ElementIsInSet=true; 
       break; 
     } 
    } 

    return ElementIsInSet; 
} 

これは私が何をするかです。いくつかのチェックを行う関数を作成し、その要素がすでに存在する場合は私に真実を与えます。

大きな配列を使って作業していて、動作が遅いと感じる場合は、検索を最適化するための他の解決策がありますが、私はあなたが疑うでしょう。

EDIT:現在の値を保存するために並列構造を使用することについても、1つの値しか保存されない通常の配列(1次元)を持つことは非常に難しいでしょう。その場合Element.field_1 + Element .field_2(文字列を連結)。次に、この配列に値があるかどうかをチェックする他の関数を書くことができます。私は2つの解決策は同じで、それはスピードではなくスタイルについての質問です。

1

あるいは、次のようにアレイを拡張するか、あなたのプロトタイプを定義することができます:[] .add(yourElementが)だけにその要素を追加します使用して、

ので
Array.prototype.add = function(element){ 
    var itemExists = false; 
    for(var i=0;i<this.length;i++){ 
     if(this[i]==element){ 
      itemExists = true; 
      break; 
     } 
    } 
    if(itemExists==false) 
     return this.push(element); 
} 

配列が存在しない場合は配列を返します。あなたの必要に応じて、引数の構造と条件を自由に変更してください。

関連する問題