2013-10-04 300 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,是的,不知何故,我沒有把最後一個值作爲一個對象,而'null'類型是'對象'。愚蠢的錯誤。固定。 – plalx