0

これは、配列から負の整数を削除していません。なぜなのかわかりません...

for(var ii = 0; ii < diffs.length; ii++) {
     if(Number(diffs[ii]) < 0) {
       diffs.splice(ii, 1);
     }
   }
4

4 に答える 4

2

現在の要素を削除すると、配列内の他の要素が下に移動し、次の要素がスキップされるため、走査中に配列を変更している場合、配列を 0 から上方に走査することはできません。

これを解決する一般的な方法は、配列要素を逆の順序でトラバースすることです。これは、現在の要素を削除して再配置される要素は、forループが次に処理する要素ではなく、既にトラバースした要素であるためです。

for(var ii = diffs.length - 1; ii >= 0; ii--) {
    if(Number(diffs[ii]) < 0) {
        removed.push(diffs[ii]);
        diffs.splice(ii, 1);
    }
}

また、アレイから削除する前に、削除したアイテムをプッシュする必要があります。

于 2012-08-05T00:14:30.667 に答える
2

2 つの問題があります。1) 配列内の項目を削除するときは、カウンターをインクリメントしないようにする必要があります (これは、最後からカウントすることで回避できます)。2) splice の結果を保存してから、削除した配列に追加する必要があります

for(var ii = diffs.length - 1; ii >= 0; ii--) {
    if(+diffs[ii] < 0) { // use the unary plus operator to convert to a number, just in case
        removed.push(diffs.splice(ii, 1)[0]); //splice returns an array - get the first and only element in it
    }
}
于 2012-08-05T00:17:20.990 に答える
0

配列を前方にトラバースしているときにアイテムを削除する場合は、ループ変数を調整するか、次の要素をスキップする必要があります。他の可能性は、後方にトラバースすることです。

for (var i=0; i<diffs.length; i++)
    if (Number(diffs[i]) < 0)
        diffs.splice(i--, 1);

// OR

for (var i=diffs.length-1; i>=0; i--)
    if (Number(diffs[i]) < 0)
        diffs.splice(i, 1);

diffs新しい配列を作成して変数を上書きする方が簡単(場合によってはさらに高速)になる可能性があります。filter()これは、次の方法で非常にエレガントに機能します。

var diffs = diffs.filter(function(diff) { return Number(diff) >= 0; });
于 2012-08-05T00:24:59.787 に答える
0

インデックスは次のように修正することもできます。

for (ii = 0; ii < diffs.length; ii++) {
    if (Number(diffs[ii]) < 0) {
        removed.push(diffs[ii]);
        diffs.splice(ii, 1);
        ii--;
    }
}
console.log(diffs);
console.log(removed);

フィドル

今私が見るように、この答えを再び遅すぎて投稿しました:)

于 2012-08-05T00:29:55.743 に答える