2012-07-23 61 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