2010-12-13 119 views
8

我有一個嵌套Javascript對象像使用Javascript:使用動態變量名

var data = { 'name': { 'heading': 'Name', 'required': 1, 'type': 'String' }, 
      'profile': { 
        'age': { 'heading': 'Age', 'required': 0, 'type': 'Number' }, 
        'phone': { 'heading': 'Phone', 'required': 0, 'type': 'String'}, 
        'city': { 'heading': 'City', 'required': 0, 'type': 'String'}, 
        }, 
      'status': { 'heading': 'Status', 'required': 1, 'type': 'String' } 
      }; 

在這裏,在JSON數據訪問嵌套值,我可以訪問字段data.profile.age.type或data.name.type 。沒有問題 如果我有動態變量名稱,我可以訪問如下。再次,沒有問題。

f = 'profile'; data[f].age.type 

但是,在這裏我有變量名,如「名」,「profile.age」,「profile.city」等等,顯然我不能訪問他們爲f =「profile.age」;數據[f] .type不起作用。

任何人都可以指導我如何以最直接簡單的方式訪問它們(get/set)嗎?

注:我試過這個,它適用於get。

data.get = function(p) { o = this; return eval('o.'+p); }; 
f = 'profile.age'; data.get(f).name; 

雖然設置似乎不夠簡單。請讓我知道,如果有更好的解決方案獲取和設置。

+2

你是正確的問這個問題的SO。每當你發現自己在JavaScript中使用eval時,你幾乎肯定會做錯事情。 – 2010-12-13 17:40:22

+0

謝謝你讓我知道eval。可能是eval是邪惡的! :-) – rsmoorthy 2010-12-13 17:53:39

+0

你說的。看看這裏提供的最後一個建議:http://javascript.crockford.com/code.html – 2010-12-13 18:26:02

回答

7

不要使用eval,除非絕對必要。 :)至少在這種情況下,有更好的方法來做到這一點 - 你可以嵌套的名字分成單獨的部分,並在它們之間迭代:

data.get = function(p) { 
    var obj = this; 

    p = p.split('.'); 
    for (var i = 0, len = p.length; i < len - 1; i++) 
    obj = obj[p[i]]; 

    return obj[p[len - 1]]; 
}; 

data.set = function(p, value) { 
    var obj = this; 

    p = p.split('.'); 
    for (var i = 0, len = p.length; i < len - 1; i++) 
    obj = obj[p[i]]; 

    obj[p[len - 1]] = value; 
}; 
+0

謝謝。非常快速的響應和有益的。 – rsmoorthy 2010-12-13 17:51:30

8

你可以嵌套括號:

var a = 'name', b = 'heading'; 
data[a][b]; // = `Name` 
+1

這是根本不回答的問題... – vsync 2011-09-21 11:53:38

+1

@vsync:當然可以。我在說,而不是'var a ='name.heading';數據[a]',您可以使用連續的括號組來訪問對象的更深層次。所以如果你知道你在'profile'對象中尋找某個東西,'var a ='profile',b ='age';數據[a] [b]'起作用。顯然,如果你需要處理一個任意字符串,其他答案顯示如何做到這一點。如果有人不需要解析任意''a.b.c.d「'字符串的複雜性,這是一種選擇。 – josh3736 2011-09-21 14:43:46

2

也許這需要在路徑中你感興趣的財產,將其分解爲代表的屬性標記功能。像這樣的東西(這是很粗糙的,當然):

data.get = function(path) { 
    var tokens = path.split('.'), val = this[tokens[0]]; 
    if (tokens.length < 2) return val; 
    for(var i = 1; i < tokens.length; i++) { 
    val = val[tokens[i]]; 
    } 
    return val; 
} 

例如:

var f = 'one.two'; 
    var data = { one: {two:'hello'}}; 
    data.get = /* same as above */; 

    var val = data.get(f); 
0

它使用jquery.each()函數來遍歷下來使用可能包含或不包含一個或多個「。」的字符串變量的json樹。你可以選擇傳入一個數組並忽略.split();

pathString =類似 「person.name」

jsonObj =類似{ 「人」:{ 「名」: 「瓦萊麗」}}。

function getGrandchild(jsonObj, pathString){ 
    var pathArray = pathString.split("."); 
    var grandchild = jsonObj; 
    $.each(pathArray, function(i, item){ 
     grandchild = grandchild[item]; 
    }); 
    return grandchild; 
}; 

返回 「瓦萊麗」