2014-03-25 63 views
0

比方說,我有一個字符串:'first.second.last'使用字符串來訪問多維對象?

我也有一個對象:使用字符串

{ 
    'first': { 
     'second' : { 
      'last': "value" 
     } 
    } 
} 

如何訪問"value"

+0

是啊,對不起。有時候我不會使用正確的單詞。 –

回答

2

事情是這樣的......

var o = { 
    'first': { 
     'second' : { 
      'last': "value" 
     } 
    } 
}; 
var s = 'first.second.last'; 
var val = s.split('.').reduce(function(p, c) { 
    return p.hasOwnProperty(c) && p[c] || p; 
}, o); 

這就會鑽到你的對象,並找到相匹配的最深的關鍵。相反,如果你想返回null任何未能匹配項,將reduce回調

function(p, c) { 
    return p && p.hasOwnProperty(c) && p[c] || null; 
} 

如果您需要爲Array.prototype.reduce傳統支持,請參閱https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce#Polyfill

+0

優秀。這正是我所期待的。 –

+0

這將返回意外的結果,該字符串與對象中的路徑不匹配。 –

+0

@FelixKling這是一個自頂向下的搜索。它會返回最匹配的值(我在答案中提到)。我想它可以簡單地返回null,但OP需要澄清他們的需求 – Phil

1

這不是一個數組,它是一個對象。如果您要訪問last在該對象中,如果有與內容的變量命名爲example

example['first']['second']['third'] 

如果你想有一個動態的設置,其中你不知道的深度嘗試類似:

var myString = 'first.second.last' 
var myObj = { 
    'first': { 
     'second' : { 
      'last': "value" 
     } 
    } 
} 

myString.split('.').forEach(function(item) { 
    myObj = myObj[item]  
}) 

最終值會有你想要的輸出。有人現在可能會有一個簡單的實用程序或庫來完成這個工作,或者更實用的方法來應用這種方法,但遺憾的是現在並沒有更聰明的想法。

+0

我在控制檯中試過了,沒有工作。 –

+0

再試一次。測試它的工作。 – bitoiu

+0

現在工作,一定沒有複製它的一部分。 –

0

您可以訪問類似於對象數組使用[]符號。如果分割字符串到它,你可以去sample["first"]["second"]["third"]

因此,這應該工作,我認爲:

var sample = { 
    'first': { 
     'second' : { 
      'last': "value" 
     } 
    } 
} 

var str = "first.second.last"; 
var current = sample; 
str.split('.').forEach(function(prop) { 
    current = current[prop]; 
}) 
return current;