Поиск массива для соответствия атрибуту

У меня есть массив, мне нужно вернуть название ресторана, но я знаю только его атрибут "food" (а не индекс).

Например, как я мог вернуть "KFC", если бы знал только "курицу"?

restaurants = 
  [
    {"restaurant" : { "name" : "McDonald's", "food" : "burger" }},
    {"restaurant" : { "name" : "KFC",        "food" : "chicken" }},
    {"restaurant" : { "name" : "Pizza Hut",  "food" : "pizza" }}
  ];

Ответ 1

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

Ответ 2

В этом случае я бы использовал файл ECMAscript 5 Array.filter. Для следующего решения требуется array.filter(), который не существует во всех версиях IE.

Прокладки можно найти здесь: MDN Array.filter или ES5-shim

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

Ответ 3

вы также можете использовать Array.find функцию es6. doc здесь

return restaurants.find(item => {
   return item.restaurant.food == 'chicken'
})

Ответ 4

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

Ответ 5

Должно быть слишком поздно, но правильная версия:

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

Ответ 6

вы можете использовать ES5. Его довольно сначала, используя обратный вызов

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

Ответ 7

@Chap - вы можете использовать эту javascript lib, DefiantJS (http://defiantjs.com), с помощью которой вы можете фильтровать совпадения с помощью XPath на структурах JSON, Чтобы поместить его в код 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 расширяет глобальный объект методом "поиск" и возвращает массив со спичками (пустой массив, если совпадений не найдено). Вы можете опробовать запросы lib и XPath с помощью XPath Evaluator:

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