2013-03-27 42 views
1

的陣列構造對象我有以下陣列JavaScript的從字符串

var testArray = ["test1", "test2", "test3"]; 

並且具有其它物體在它

var obj.test1.test2.test3 = "test"; 

欲FOREACH的testArray

一個obj並得到以下內容

obj[testArray[0]][testArray[1]][testArray[2]] 

obj["test1"]["test2"]["test3"]

等於obj.test1.test2.test3,當你說你都知道將返回「測試」

回答

2

,我們可以利用obj["test1"]符號的嵌套自己更深的目標對象。在這種情況下,在每次迭代中,我們重新指定我們指向的最上面的是最後一次迭代的子節點。

var obj = { test1: { test2: {test3: 'test' }}}; 
var current = obj; 

var arr = ['test1', 'test2', 'test3']; 
for(var i = 0; i < arr.length; i++){ 
    if(current === undefined){ break; } 
    current = current[arr[i]]; 
} 

console.log(current); 
+0

還有一些錯誤處理不起作用:如果(當前===未定義){打破;} – HMR 2013-03-27 12:38:37

+0

@HMR大點,更新 – Matt 2013-03-27 12:42:50

+0

謝謝非常! – Mdb 2013-03-27 12:47:17

0

如何:

var testArray = ["test1", "test2", "test3"]; 
var value = [obj].concat(testArray).reduce(function(prev, curr) { 
    return prev[curr]; 
}); 

但請記住,reduce不被IE < = 8(Reduce reference)的支持。

0
function extractDeep(obj, propPathArr) { 
    var prop = obj; 
    propPathArr.forEach(function (item) { 
     prop = prop[item]; 
    }); 
    return prop; 
} 

調用,比如:

alert(extractDeep({a: {b: {c: "The property!"}}}, ['a', 'b', 'c'])); 

注:

  • 你真的應該加入一些錯誤檢查。
  • forEach在所有瀏覽器

jsFiddle can be found here