2012-10-24 3 views
1

입니다 :그래서 나는 다음과 같습니다 코드 블록이 자바 스크립트/노드

stack.forEach(function(element){ 
    //sys.puts(sys.inspect(element, false, null)); 
    console.log('-----element start-----'); 
    console.log(element.type + ':' + element.raw); 
    console.log('-----element end-----'); 

    if(element.children){ 
     element.children.forEach(function(childElement){ 
     stack.push(childElement); 
     }); 
    } 
    }); 

문제는 이것이 내가 스택을 제외시켰다 것처럼 작동하지 않는 행동을하고 궁금 점이다 자바 스크립트 자체의 문제입니다. 각 자식이 처리를 위해 스택에 추가하기 위해 stack.push를 호출하면 초기 stack.forEach()가이를 선택하지 않고 최상위 요소에만 로깅하는 경우 나타나는 문제입니다. . 이 스택 바로 다음에 다른 스택을 시도하면 .push가 자식 요소를 스택에 추가하고 있음을 알 수 있으므로 다음 수준의 하위 요소를 표시합니다.

.forEach()는 마치 데이터를 그대로 잡고 foreach 내에서 발생하면 업데이트되지 않습니다. 자바 스크립트에서도 마찬가지입니까? 같은 것을 달성 할 수있는 다른 방법이 있습니까 (최상위 요소와 하위 요소의 모든 레벨을 처리 할 수 ​​있어야합니다)?

답변

3

귀하의 가정이 맞습니다. ForEach 함수는 배열의 스냅 샷을 취하고 모든 업데이트는 처리되지 않습니다.

당신은 다음과 같이 가장 쉽게 재귀 함수로 코딩 할 수있는 고전적인 트리 탐색 알고리즘을 구현하기 위해 노력하고있다 :

var stack = []; 

    function traverse (element) { 
    //sys.puts (sys.inspect(element, false, null)); 
    console.log ('-----element start-----'); 
    console.log (element.type + ':' + element.raw); 
    console.log ('-----element end-----'); 

    stack.push (element); // for preorder traversal (parent before children) 

    if (element.children) 
     element.children.forEach (traverse); 

    // stack.push (element); // for postorder traversal (children before parent) 
    }; 

    traverse (document.body); // for example 
+0

사실은 그렇지 않습니다. 배열 항목을 삭제/연결하거나 수정하면 동작이 변경되어 '길이'스냅 샷 만 사용됩니다. – Bergi

+0

나는 그것을 알았어, 고마워. – HBP

1

예, .forEach 만 배열이 처음이 범위를 반복 않으며, 작동 .length 값의 복사본이 있어야합니다.

var stack = […]; 
for (var i=0; i<stack.length; i++) { 
    // process stack[i] 
    stack.push(…); 
} 

또는

var stack = […]; 
while (stack.length) { 
    var cur = stack.shift(); 
    // process cur 
    stack.push(…); // with variable arguments, you want to stop somewhen :-) 
} 

심지어 더 많은 목록 같은 행동은 '돈 경우 해당 동작을 변경하려는 경우, 나는 length 재산 매번 쿼리 고전적인 루프를 권 해드립니다 스택 자체를 유지하기를 원한다. 재귀 함수는 트리 탐색에 적합한 선택이다.

관련 문제