어제 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만큼 줄어들지만 j는 여전히 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씩 줄어들고 그 이후의 요소는 한 자리 앞으로 이동한다는 점을 고려해야 합니다.