1

次のコードがあります。

  $.each(current, function(index, value) {
     thisArray = JSON.parse(value);
     if (thisArray.ttl + thisArray.now > now()) {
        banned.push(thisArray.foodID);
     }
     else{
        current.splice(index,1);
     }
  });

次の行に問題があります。

current.splice(index,1);

何が起こるかというと、(おそらく) 条件に適合する最初のケースをelse設定解除し、それが再び発生する必要がある場合、キーが一致しなくなり、他のものを設定解除できなくなります。一度は機能しますが、次の反復では機能しません。

これに対する修正はありますか?

4

3 に答える 3

2

通常のforループを使用して、逆方向にループできます。

for(var i=current.length-1; i>= 0; i--) {
   var thisArray = JSON.parse(current[i]);
   if (thisArray.ttl + thisArray.now > now()) {
      banned.push(thisArray.foodID);
   } else {
      current.splice(i, 1);
   }
});

また、thisArray実際には配列ではなくオブジェクトのようです...

于 2013-08-17T20:17:15.597 に答える
0

通常のforループを使用できますが、スプライスの後、インデックスを1減らします

for(var i=0; i<current.length; i++){
    current.splice(i, 1); i--;
    }
于 2013-08-17T20:25:17.413 に答える
0

あなたの場合のように一部の要素がスキップされる可能性があるため、トラバース中に配列を(オブジェクトを移動して)変更する場合は注意が必要です。

要素を呼び出すと、current.splice(index, 1)要素indexが削除され、要素index+1が代わりになります。ただし、その後indexインクリメントされるため、1 つの要素がスキップされます。

より良い解決策は、読み書きアプローチの IMO です。1 つのインデックスを「読み取りポインター」として保持し、常にインクリメントし、別のインデックス (「書き込みポインター」) は、要素を配列に保持する必要があると判断した場合にのみインクリメントされます。

var wp = 0;  // The "write pointer"
for (var rp=0; rp<a.length; rp++) {
    if (... i want to keep element a[rp] ...) {
        a[wp++] = a[rp];
    }
}
a.splice(wp); // Remove all elements after wp

これはo(N)操作であり、各要素を最大 1 回移動します。splice(i, 1)最後から開始して代わりに同じアプローチを使用するなどの他のアプローチではi、要素を削除する必要があるたびに、すべての要素を移動し続けます。

于 2013-08-17T20:25:23.947 に答える