昨日、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);
出力:
これは、配列から要素が削除されると、配列の長さが 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);
出力:
配列要素の削除と同様に、配列の長さが 1 ずつ削減されることを考慮する必要があります、次の要素は 1 つ前に進みます