2012-07-23 125 views
0
複雜的屬性值

鑑於JSON是這樣的:獲取對象

{ "rss": { 
    "page": 1, 
    "results": [{ 
     "type": "text", 
     "$": 10 
    }], 
    "text": [{ 
     "content": "Lorem ipsum dolor sit amet.", 
     "author": { 
     "name": "Cesar", 
     "email": "[email protected]" 
     }, 
    }, 
    { 
     "content": "Tema Tis rolod muspi merol.", 
     "author": { 
     "name": "Cleopatre", 
     "email": "[email protected]" 
     }, 
    }] 
} 

在JavaScript中,我可以這樣檢索值:

var json = JSON.parse(datajson); 
$.each(json.text, function(key, val) { 
    // this one is ok 
    var content = val['content']; 
    // this one does not work 
    var authorname = val['author.name']; 
}); 

這是一種方式,給定一個字符串屬性名稱格式來檢索複雜對象的值,例如json.text[0].author.name

編輯 我想需要的屬性存儲在另一個對象,如:

[ 
    { dt: "Text content", dd: "content" }, 
    { dt: "Author name", dd: "author.name"} 
] 
+1

試試'VAL [「作者」] [「名稱」]' – 2012-07-23 14:50:36

+0

好,這可能會奏效,但在這種情況下,我需要存儲兩個字符串:「作家」,那麼「名」,當我想存儲只有一個代表authorname,如xpath或css路徑... – enguerran 2012-07-23 14:52:11

+1

快速和髒var name = eval('return val。'+ key +';'); – yent 2012-07-23 14:52:49

回答

2

您可以通過.和環比「段」拆你的「指標」,通過在每次迭代的水平下降。

var obj = { 
    author : { 
     name : "AuthorName" 
    } 
} 

function get_deep_index(obj, index) { 
    var segments = index.split('.') 
    var segments_len = segments.length 
    var currently_at = obj 
    for(var idx = 0; idx < segments_len; idx++) { 
     currently_at = currently_at[segments[idx]] 
    } 
    return currently_at 
} 

console.log(get_deep_index(obj, 'author.name')) 
+0

這可能是我接受的答案,恭喜;) – enguerran 2012-07-23 15:25:40

2

下應該可以解決問題。你可以索引從屬性後

var author = val['author']; 

然後:

var authorname = val['author']['name']; 

您還可以存儲對象本身。

console.log(author.name, author.email) 
+0

好吧,這可能會工作,但在這種情況下,我需要存儲兩個字符串:'作者',然後'名稱',當我想只存儲一個代表authorname,如xpath或css路徑... – enguerran 2012-07-23 14:54:08

+0

什麼它通過只使用一個字符串來保存你?最後,解析它以獲取數據將會變得更慢。 – epascarello 2012-07-23 14:57:03

+0

通過索引對象的屬性確實沒有太多性能問題。嘗試將已經存在的對象編碼爲JSON並稍後解碼會更加惡化,這正是我想要的。 – Q2Ftb3k 2012-07-23 15:00:05

-2

Yent在評論函數中給出了一個很好的提示。我解決我需要用這種代碼:

var json = JSON.parse(myjsonasastring); 

var descriptiontobeadded = [ 
    { dt: "Text content", dd: "content" }, 
    { dt: "Author name", dd: "author.name" } 
]; 

$.each(descriptiontobeadded, function(key, val) { 
    var dt = '<dt>' + val.dt + '</dt>'; 
    description.append(dt); 
    var dl = '<dd>' + eval('json.' + val.dd) + '</dd>'; 
    description.append(dl); 
}); 
+0

javascript專家對這類代碼有什麼看法? – enguerran 2012-07-23 15:04:01

+0

我建議用json [val.dd]替換eval,性能要好得多。 – Q2Ftb3k 2012-07-23 15:05:07

+0

但'val.dd'可能包含類似'author.name'的東西... – enguerran 2012-07-23 15:08:05