ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScript の for ループで配列要素の内容を削除するときに発生する問題

JavaScript の for ループで配列要素の内容を削除するときに発生する問題

高洛峰
高洛峰オリジナル
2016-12-06 13:13:211360ブラウズ

昨日、for ループを使用して配列の重複を排除するときに発生した問題、

まず、二重の for ループを使用して、前の要素と後続のすべての要素を比較し、等しい場合は削除します。

ただし、配列内に連続する等しい要素が 3 つ以上ある場合、問題が発生します。

var arr = [1,1,1,2,2];
for(var i=0; i<arr.length-1; i++){
for(var j=i+1; j<arr.length; j++){
if(arr[i] === arr[j]){
arr.splice(j,1);
}
}
}
document.write("arr:"+arr);

出力:

JavaScript の for ループで配列要素の内容を削除するときに発生する問題

これは、配列から要素が削除されると、配列の長さが 1 減り、後続の要素が 1 つ前に移動され、インデックスがも 1 減りますが、j++ の操作は続行されます。

つまり、初回削除時はi=0 j=1、削除後arr=[1,1,2,2]、そしてj=2の場合、削除後のj=1の要素は無視されます。そしてトラバースを続けます。

したがって、削除が実行されるたびに、j は 1 ずつ削減される必要があります

var arr = [1,1,1,2,2];
for(var i=0; i<arr.length-1; i++){
for(var j=i+1; j<arr.length; j++){
if(arr[i] == arr[j]){
arr.splice(j--,1);
}
}
}
document.write("arr:"+arr);

出力:

JavaScript の for ループで配列要素の内容を削除するときに発生する問題

配列要素の削除と同様に、配列の長さが 1 ずつ削減されることを考慮する必要があります、次の要素は 1 つ前に進みます


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。