2016-03-16 64 views
0

访问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 AEvent B作为源如下:

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

问题

是否有可能通过name f的值选择此ield?

喜欢的东西:$(data.menu[name="Event A"].sub)

+1

这不是JSON,这是一个JavaScript对象初始化。 JSON是数据交换的文本符号。如果您正在使用JavaScript源代码,而不是处理*字符串*,那么您不会处理JSON。 –

回答

4

是否有可能通过name字段的值来选择呢?

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

Array#find(ES2015 +,但可以垫高):

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的箭头功能简单:

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

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

你必须遍历,找到你想要的菜单:

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

你可以使用lodash或类似的。它非常易于使用。使用lodash filter

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

你的情况:

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