가장 일반적으로 사용되는 Traversal 방법은 진술 (재귀 및 기간)입니다. 배열을 가로 지르면 일반적으로 다음을 수행합니다.
코드 사본은 다음과 같습니다.
var arr = [1,2,3,4,5,6,7,8,9,10];
for (var i = 0, total = arr.length; i <total; i ++) {
Console.log (i, arr [i]);
}
이것은 가장 일반적으로 사용되는 트래버스 방법입니다 : 양수 순서 트래버스. 배열의 첫 번째 항목에서 마지막 항목으로 이동합니다.
그렇다면 왜 작은 드라마는 오늘날에도 여전히 역 순서 횡단을 언급합니까?
여기서는 Xiaoju가 작성한 구성 요소에서 가장 일반적으로 사용되는 모듈을 언급해야합니다. 맞춤형 이벤트 모델을 만들고 이벤트 청취 및 트리거링을 처리하는 데 사용됩니다. 가장 간단한 게시 및 구독 모드. 최근에 메모리 오버플로의 숨겨진 위험이 있음을 발견했기 때문에 원래의 기준으로 풀릴 수있는 방법을 추가해야합니다.
동일한 이벤트 이름을 가진 콜백 함수가 동일한 배열에 배치되기 때문에 결합 해제는 배열에서 해당 콜백 함수를 찾는 경우 (동일한 콜백 함수가 여러 번 바인딩 될 수 있음)를 제거하면됩니다.
매우 간단한 요구 사항이므로 다음과 비슷한 코드를 자연스럽게 썼습니다.
코드 사본은 다음과 같습니다.
// 배열에서 2를 제거합니다
var arr = [1,2,2,2,2,1,1,2,2];
for (var i = 0, total = arr.length; i <total; i ++) {
if (arr [i] == 2) {
// 조건을 충족하고 제거하십시오
arr.splice (i, 1);
}
}
Console.log (ARR);
일반적인 코드는 없지만 최종 출력은 [1, 2, 2, 1, 1, 2]입니다. 분명히 실행 결과는 기대치를 충족시키지 못합니다.
문제는 무엇입니까?
신중한 분석 후, 문제는 경기가 성공할 때마다 제거 작업을 수행 한 후에 확인할 다음 항목이 배열의 각 항목이 하나씩 상승하기 때문에 건너 뛸 수 있다는 것입니다.
문제를 발견하고 코드를 변경했으며 제거 작업을 수행 한 후 시퀀스 인덱스 (I)를 조정하십시오.
코드 사본은 다음과 같습니다.
// 배열에서 2를 제거합니다
var arr = [1,2,2,2,2,1,1,2,2];
for (var i = 0, total = arr.length; i <total; i ++) {
if (arr [i] == 2) {
// 조건을 충족하고 제거하십시오
arr.splice (i, 1);
// 시퀀스 인덱스를 조정합니다
i = i-1;
}
}
Console.log (ARR);
문제가 해결되었지만 항상 시퀀스 인덱스를 수정하는 것이 루프를 만드는 속임수라고 생각합니다. 따라서 영감의 번쩍임과 때리는 소리와 다음 코드가 발생했습니다.
코드 사본은 다음과 같습니다.
// 배열에서 2를 제거합니다
var arr = [1,2,2,2,2,1,1,2,2];
for (var i = arr.length-1; i! = -1; i-) {
if (arr [i] == 2) {
// 조건을 충족하고 제거하십시오
arr.splice (i, 1);
}
}
Console.log (ARR);
트래버스 프로세스는 변경되지 않았습니다. 변화하는 유일한 것은 횡단 순서가 바뀌 었다는 것입니다. 그건 그렇고, 총 하나의 변수 누락이 있습니다.
좋아, 나는 오늘 내가 쓴 것이 매우 부드럽다는 것을 인정하지만,이 예를 통해 앞으로 코드를 작성할 때 상기시켜줍니다. 트래버스 프로세스 동안 배열 자체 (추가 및 삭제)를 수정하는 경우 리버스 트래버살은 비교적 안전한 트래버스 방법입니다.
코딩 메모, 미래에 자신을 조롱하도록 떠나십시오!
http://bh-lay.com/blog/148c07761fa를 재 인쇄 소스를 표시하십시오