在数组中search匹配的属性

我有一个数组,我需要返回一个餐厅的名字,但我只知道它的“食物”属性的价值(不是索引号)。

例如,如果我只知道“鸡”,我怎么能返回“肯德基”呢?

restaurants = [ {"restaurant" : { "name" : "McDonald's", "food" : "burger" }}, {"restaurant" : { "name" : "KFC", "food" : "chicken" }}, {"restaurant" : { "name" : "Pizza Hut", "food" : "pizza" }} ]; 
 for(var i = 0; i < restaurants.length; i++) { if(restaurants[i].restaurant.food == 'chicken') { return restaurants[i].restaurant.name; } } 

在这种情况下,我会使用ECMAscript 5 Array.filter。 以下解决scheme需要在所有版本的IE中都不存在的array.filter()。

可以在这里find垫片: MDN Array.filter或ES5垫片

 var result = restaurants.filter(function (chain) { return chain.restaurant.food === "chicken"; })[0].restaurant.name; 

您也可以使用Array.findfunction。 文档在这里

 return restaurants.find(item => { return item.restaurant.food == 'chicken' }) 
 for (x in restaurants) { if (restaurants[x].restaurant.food == 'chicken') { return restaurants[x].restaurant.name; } } 

现在已经太晚了,但是正确的版本是:

 for(var i = 0; i < restaurants.restaurant.length; i++) { if(restaurants.restaurant[i].food == 'chicken') { return restaurants.restaurant[i].name; } } 

你可以使用ES5的一些。 它首先使用callback

 function findRestaurent(foodType) { var restaurant; restaurants.some(function (r) { if (r.food === id) { restaurant = r; return true; } }); return restaurant; } 

@Chap – 你可以使用这个JavaScript的lib,DefiantJS( http://defiantjs.com ),你可以使用JSON结构上的XPath过滤匹配。 把它放在JS代码中:

 var data = [ { "restaurant": { "name": "McDonald's", "food": "burger" } }, { "restaurant": { "name": "KFC", "food": "chicken" } }, { "restaurant": { "name": "Pizza Hut", "food": "pizza" } } ]. res = JSON.search( data, '//*[food="pizza"]' ); console.log( res[0].name ); // Pizza Hut 

DefiantJS使用“search”方法扩展全局对象,并返回一个包含匹配的数组(如果没有find匹配,则返回空数组)。 您可以在这里使用XPath Evaluator来尝试lib和XPath查询:

http://www.defiantjs.com/#xpath_evaluator