Поиск массива для соответствующего атрибута - PullRequest
53 голосов
/ 30 января 2010

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

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

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

Ответы [ 7 ]

66 голосов
/ 30 января 2010
for(var i = 0; i < restaurants.length; i++)
{
  if(restaurants[i].restaurant.food == 'chicken')
  {
    return restaurants[i].restaurant.name;
  }
}
44 голосов
/ 15 января 2013

В этом случае я бы использовал 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;
35 голосов
/ 21 сентября 2016

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

return restaurants.find(item => {
   return item.restaurant.food == 'chicken'
})
7 голосов
/ 11 января 2011
for (x in restaurants) {
    if (restaurants[x].restaurant.food == 'chicken') {
        return restaurants[x].restaurant.name;
    }
}
1 голос
/ 05 января 2014

@ Chap - вы можете использовать эту библиотеку JavaScript, 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

1 голос
/ 23 августа 2013

Вы можете использовать ES5 некоторые. Это довольно первое использование обратного вызова

function findRestaurent(foodType) {
    var restaurant;
    restaurants.some(function (r) {
        if (r.food === id) {
            restaurant = r;
            return true;
        }
   });
  return restaurant;
}
1 голос
/ 06 октября 2010

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

for(var i = 0; i < restaurants.restaurant.length; i++)
{
  if(restaurants.restaurant[i].food == 'chicken')
  {
    return restaurants.restaurant[i].name;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...