按名称访问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)