2013-10-04 5 views
0

두 값을 모두 유지하면서 두 개체를 압축해야하는 경우가 있습니다. 두 객체를 반복하고 모든 키 배열을 만들 수 있습니다.중첩 된 속성의 배열에서 개체 중첩 값 가져 오기

var traverse = function (obj, chain) { 

     for (var prop in obj) { 
      if (obj.hasOwnProperty(prop)) { 

       var tempChain = [].concat(chain || []); 
       tempChain.push(prop); 

       if (typeof obj[prop] === 'object') { 
        traverse(obj[prop], tempChain); 
       } 
       console.log(tempChain); 
      } 
     } 
    }; 

다음에 전달 :

traverse({ 
     'a': { 
      'b': 'hello world', 
      'b1': 'hello world 1', 
      'c': { 
       'd': 'dello' 
      } 
     } 
    }) 

저를 반환합니다

[a] 
[a,b] 
[a,b1] 
[a,c] 
[a, c, d] 

그래서 지금은 객체의 중첩 된 속성의 배열을 가지고있다. 본질적으로 obj [[a, c, d]]에 어떻게 접근 할 수 있습니까? eval을 통해 문제를 해결할 수 있지만 콘텐츠를 신뢰할 수는 없다는 것을 알고 있습니다.

eval('window.' + ['a','c','d'].join('.')); 

내가 그 배열을 통해 루프를 할 수 있고 값 조합 '압축'의 새로운 객체를 속성이 둘 다에있는 경우 다음을 참조 구축 확인합니다.

+0

'창 == obj', 그 어쨌든 작동하지 않을 것입니다. 하지만 네, 간단한 루프를 사용할 수 있습니다. – Bergi

+0

[중복 된 항목 중] (http://stackoverflow.com/a/14397052/1048572)을 확인하십시오. 배열이 이미 있으므로'.split (".")'을 생략하십시오 – Bergi

+0

이것은 일종의 것으로 생각합니다. [XY 문제] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). 'zip'은 정확히 무엇을하기로되어 있으며, 왜 그 속성 체인이 필요한가요? – Bergi

답변

1

아마도 이와 비슷한가요?

function getValueAt(obj, keyPathArray) { 
    var emptyObj = {}; 

    return keyPathArray.reduce(function (o, key) { 
     return (o || emptyObj)[key]; 
    }, obj); 
} 

그럼 당신이 원하는 사용할 수 있습니다

var o = { a: { c: { d: 1 } } }; 

getValueAt(o, ['a', 'c', 'd']); //1 

을가 존재하지 않는 속성에 대한되지 효율적 그러나,이 단락하지 않습니다입니다. 여기 reduce를 사용하지 않고 다른 방법입니다!

function getValueAt(o, keyPathArray) { 
    var i = 0, 
     len = keyPathArray.length; 

    while (o != null && i < len) o = o[keyPathArray[i++]]; 

    return o;  
} 
+0

단순히 'while (o! = null && i Bergi

+0

두 솔루션을 모두 사용해 보았지만 함수가 값을 반환하고 값을 가리키는 개체를 원합니다. 더 나은 설명을하기 위해 evals를 사용하는 작업 코드에 대해 설명합니다. http://jsbin.com/EHeFayu/7/ – dtsn

+0

@Bergi, 그래, 어쨌든 나는 마지막 값이 객체가 될 수 있고 그 typeof 'null'은 '객체'라는 것을 강요하지 못했다. 어리석은 실수. 결정된. – plalx

관련 문제