按名称访问JSON子级别

我有以下示例JSON

var data = { "menu": [ { "name": "Event A", "sub": [{ "name": "Sub Event A 1", "sub": null }, { "name": "Sub Event A 2", "sub": [{ "name": "Sub Sub Event A 2", "sub": null }] } ] }, { "name": "Event B", "sub": [{ "name": "Sub Event B 1", "sub": null }, { "name": "Sub Event B 2", "sub": [{ "name": "Sub Sub Event B 2", "sub": null }] } ] } ] } 

当我创建菜单时,我可以轻松选择是使用Event A还是Event B作为源,如下所示:

 $(data.menu[0].sub).each(function(){ /* menu[0] therefore first, Event A */ $menu1.append( getMenuItem1(this) ); }); 

是否可以通过name字段的值来选择它?

类似于: $(data.menu[name="Event A"].sub)

是否可以通过name字段的值来选择它?

是的,使用Array#find (如果你只想要第一个)或Array#filter (如果你想要所有匹配的)。

Array#find #find(ES2015 +,但可以是shimmed):

 var firstMatchingItem = data.menu.find(function(entry) { return entry.name == "Event A"; }); 

Array#filter (ES5 +,但可以填充):

 var matchingItems = data.menu.filter(function(entry) { return entry.name == "Event A"; }); 

使用ES2015的箭头function,它们看起来都更简单:

 var firstMatchingItem = data.menu.find(entry => entry.name == "Event A"); var matchingItems = data.menu.filter(entry => entry.name == "Event A"); 

你必须迭代并找到你想要的菜单:

 for (var i = 0; i < data.menu.length; i++) { if (data.menu[i].name == "Event A") { var menu = data.menu[i]; //do stuff! } } 

你可以使用lodash或类似的东西。 它非常容易使用。 使用lodashfilter :

 _.filter(data, { name: "Event A" }); 

在你的情况下:

 $(_.filter(data, { name: "Event A" })[0].sub)