2016-07-19 3 views
0

개체 트리를 탐색하고 중첩 속성을 포함하여 개체의 모든 속성을 재귀를 사용하여 인쇄하려고합니다. 여기 내 코드가 있지만 그것은 루프에 갇혀 있으며 내가 무엇을 놓치고 있는지 모르겠습니다.트래버스 개체 트리 및 인쇄 속성

var data = { 
    person: { 
    firstName: 'Mary' 
    }, 
    color: 'blue' 
}; 

function walk(root) { 
    for(var i in root) { 
    if(root.hasOwnProperty(i)) { 
     console.log(i); 
     if (root[i] !== null && root[i] !== undefined && typeof(root[i] == 'object')) { 
     walk(root[i]); 
     }  
    } 
    } 
} 

walk(data); 
+2

열기 디버거와 그것을 찾을 수 있습니다. – zerkms

+2

'typeof (root [i] == 'object')'- 어, 확실하니? – Bergi

+0

@Bergi는 디버거를 사용하는 방법을 배울 수 있습니다 .-)하지만, 10 초 안에 이미 게시 된 답변 일 것입니다. – zerkms

답변

1

참고이 용액 중첩 배열을 횡단하도록 업데이트되었습니다.

이 문제에 대한 폐쇄를 원한다. 그래서 나는 그것을 풀기 위해 약간의 시간을 보냈다. 심지어 당신은 그의 디버깅 도구로 지금도 놀고있을 수있다.

이 문제에 대한 나의 접근 방식은 instanceof API를 사용하여 해결했습니다.
참조 :
https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/instanceof

내가

  1. root.hasOwnProperty(i)
  2. if (root[i] !== null && root[i] !== undefined && typeof(root[i] == 'object'))

처럼 그 긴 호흡 검사를 할 여분의 코드에 넣어하지 않아도 그런 식으로 예 :

var data = { 
    person: { 
    firstName: 'Mary', 
    likes: { 
     food: "apple", 
     drinks: "water", 
     d: null, 
     x : { 
     y: "z", 
     ddd: [ 
      { bbb: "lol"}, 
      { PPP: "lol2"} 
     ] 
     }, 
     o: undefined 
    } 
    }, 
    color: 'blue' 
}; 

function walk(root) { 
    for (let property in root) { 
    console.log(property); 
    if (root[property] instanceof Array) 
     root[property].forEach(item => { walk(item); }); 
    else if (root[property] instanceof Object) 
     walk(root[property]); 
    // Extend else if statement to handle customize structures appropriately. 
    } 
} 

walk(data); 

출력 :

person 
firstName 
likes 
food 
drinks 
d 
x 
y 
ddd 
e 
bbb 
PPP 
o 
color 
+0

(Object.create (null) 또는 크로스 프레임 객체와 같이)'Object'에서 상속받지 않는 객체에는 작동하지 않습니다. – Bergi

+0

@Bergi 이것을 지적 해 주셔서 감사합니다. 다시 해결책을 찾아 보겠습니다. 나는 배열이 더 많은 객체로 구성되어있는 배열의 값을 가진 키를 가지고 있다면 그것이 또한 작동하지 않을 것이라고 생각한다. 예 :'ddd : [{bbb : "lol"}]'. –

+0

고마워요! 콘솔 디버거를 사용하여 내 문제를 해결할 수있었습니다.나는 그런 instanceof를 사용하는 것을 인식하지 못했습니다. 감사! – Mdd