これは、配列から負の整数を削除していません。なぜなのかわかりません...
for(var ii = 0; ii < diffs.length; ii++) {
if(Number(diffs[ii]) < 0) {
diffs.splice(ii, 1);
}
}
これは、配列から負の整数を削除していません。なぜなのかわかりません...
for(var ii = 0; ii < diffs.length; ii++) {
if(Number(diffs[ii]) < 0) {
diffs.splice(ii, 1);
}
}
現在の要素を削除すると、配列内の他の要素が下に移動し、次の要素がスキップされるため、走査中に配列を変更している場合、配列を 0 から上方に走査することはできません。
これを解決する一般的な方法は、配列要素を逆の順序でトラバースすることです。これは、現在の要素を削除して再配置される要素は、for
ループが次に処理する要素ではなく、既にトラバースした要素であるためです。
for(var ii = diffs.length - 1; ii >= 0; ii--) {
if(Number(diffs[ii]) < 0) {
removed.push(diffs[ii]);
diffs.splice(ii, 1);
}
}
また、アレイから削除する前に、削除したアイテムをプッシュする必要があります。
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
}
}
配列を前方にトラバースしているときにアイテムを削除する場合は、ループ変数を調整するか、次の要素をスキップする必要があります。他の可能性は、後方にトラバースすることです。
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; });
インデックスは次のように修正することもできます。
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);
今私が見るように、この答えを再び遅すぎて投稿しました:)