2016-09-05 6 views
0

オブジェクトが配列に存在しない場合は追加したいのですが、配列に既に存在する場合は削除してください。 最初の項目の追加に成功しましたが、配列に他のオブジェクトを追加しても機能しません。私は最初の項目を削除することができます。バグがあります。理由はわかりません。配列内の要素を追加または削除する

function checkAmi(pseudo, id) { 
    var info = ({ 
     pseudo: pseudo, 
     id: id 
    }); 
    if (amisNotifies.length > 0) { 
     // iterate over each element in the array 
     for (var i = 0; i < amisNotifies.length; i++) { 
      console.log(angular.toJson(amisNotifies[i].pseudo)); 
      // look for the entry with a matching `code` value 
      if (amisNotifies[i].pseudo === pseudo) { 
       amisNotifies.removeValue('pseudo', pseudo); 
       $("#checkAmi" + id).addClass("fa-circle-o"); 
       $("#checkAmi" + id).removeClass("fa-check-circle-o"); 
      } else { 
       amisNotifies.push(info); 
       $("#checkAmi" + id).removeClass("fa-circle-o"); 
       $("#checkAmi" + id).addClass("fa-check-circle-o"); 
      } 
     } 
    } else { 
     amisNotifies.push(info); 
     $("#checkAmi" + id).removeClass("fa-circle-o"); 
     $("#checkAmi" + id).addClass("fa-check-circle-o"); 
    } 
} 
+0

「amisNotifies」とは何ですか? 'removeValue'とは何ですか? – Tomalak

+0

amisNotifies = []; removeValueはオブジェクト値を擬似的に削除する関数です – DionysoSong

+0

標準のJS配列には 'removeValue'という関数はありません。 – Tomalak

答えて

1

疑似とすべてのアイテムを比較するだけで間違って重複をチェックしています。すべての項目をループして一致するかどうかを確認し、一致する場合は追加/削除を実行する必要があります。次のコードはあなたのために働くでしょう。

function checkAmi(pseudo, id) { 
    var info = ({ 
     pseudo: pseudo, 
     id: id 
    }); 
    var getIndexOf = function (psdu) { 
     for (var i = 0; i < amisNotifies.length; i++) { 
      if (amisNotifies[i].pseudo === psdu) { 
       return i; 
      } 
     } 

     return -1; 
    }; 

    if (amisNotifies.length > 0) { 
     var index = getIndexOf(pseudo); 
     if (index > -1) { 
      //so already exists. now remove it. 
      Array.prototype.splice.call(amisNotifies, index, 1); 
      $("#checkAmi" + id).addClass("fa-circle-o"); 
      $("#checkAmi" + id).removeClass("fa-check-circle-o"); 
     } 
     else { 
      //does not exist, now add it 
      amisNotifies.push(info); 
      $("#checkAmi" + id).removeClass("fa-circle-o"); 
      $("#checkAmi" + id).addClass("fa-check-circle-o"); 
     } 

    } else { 
     amisNotifies.push(info); 
     $("#checkAmi" + id).removeClass("fa-circle-o"); 
     $("#checkAmi" + id).addClass("fa-check-circle-o"); 
    } 
} 
+0

非常にうまく動作します! – DionysoSong

1

組み込みpopshift方法は、どちらかの端から削除:

は、ここに私のコードです。

あなたがこれ

function removeElementAtIndex(arr, i) { 
    Array.prototype.splice.call(arr, i, 1); 
} 

要素が配列は、あなたが何を意味するかに依存しでであるかどうかを見分ける方法spliceを使用することができ、配列の真ん中に要素を削除する場合"に"。 は-1ですので、NaN !== NaNですので、大丈夫ですが、コーナーケースがあります。[NaN].indexOf(NaN)-1です。NaN !== NaNですので、[NaN].indexOf(NaN)-1です。

あなたはNaN心配じゃないと仮定すると、あなたは

function togglePresent(arr, el) { 
    var idx = arr.indexOf(el); 
    if (idx >= 0) { 
    arr.splice(idx, 1); 
    } else { 
    arr.push(el); 
    } 
} 

を行うことができ、あなたが世話をすれば、あなたはisNaN(el)idxを再計算するために異なる戦略を試すことができます。

注:elのインスタンスは、arrに1つだけ削除されます。

+0

しかし、私はそれをテストするためにconsole.logを入れます。それは新しい情報をプッシュしません – DionysoSong

+0

@guillaumekotarba、どうやってログですか?オブジェクトを 'consoleに渡すと。文字列ではなく 'log'を文字列に変換するのを遅らせる可能性があります。これは、' console.log'が呼び出されたときにログメッセージがメッセージの状態を表していない可能性があることを意味します。 –

1

あなたのロジックが正しくないようです - amiNotifiesに2つのアイテムがあり、3番目の新しい値を追加したいとします。forループが初めて実行されたとき(i = 0)、アイテムを追加します)、2回目(i = 1)には追加された項目が削除され(擬似的に)、最終的に新しい項目は追加されませんので、amiNotifiesの存在に基づいて追加および削除のロジックを再検討してください。

おそらくスプライス操作を使用して、amiNotifiesから値を削除する必要があります。

関連する問題