2015-07-06 4 views
0

Я имею дело с массивом json и выполнением поиска на нем. Код выглядит нормально, но не дает выход. Это мой кодjson array поиск в javascript

var restaurants = [ 
     {"restaurant" : { "name" : "McDonald's", "food" : "burger",  "drink" : "coke", "content" : "Lorem ipsum dolor sit amet" }}, 
     {"restaurant" : { "name" : "KFC", "food" : "chicken", "drink" : "pepsi", "content" : "Lorem ipsum dolor sit amet" }}, 
     {"restaurant" : { "name" : "Pizza Hut", "food" : "pizza", "drink" : "sprite", "content" : "Lorem ipsum dolor sit amet" }}, 
     {"restaurant" : { "name" : "Dominos", "food" : "pizza", "drink" : "root beer", "content" : "Lorem ipsum dolor sit amet" }}, 
     {"restaurant" : { "name" : "Popeyes", "food" : "chicken", "drink" : "mist", "content" : "Lorem ipsum dolor sit amet" }} 
     ]; 

И мой метод для поиска

function filter(restaurants, food, drink) { 

var result = []; 

for(var i= 0, len = restaurants.length; i < len; i++) { 
    var el = restaurants.restaurant[i]; 

    if(el.food === food && el.drink === drink) { 
     result.push(el); 
    } 
} 

return result; 
} 

Но в консоли он показывает Uncaught TypeError: Cannot read property 'length' of undefined. Что не так с функцией? Как я могу выполнить полный поиск? Это о функции длины строки?

+1

Как называется функция 'filter'? Я предполагаю, что параметр 'restaurants' переопределяет глобальные« рестораны », содержащие фактические данные. – haim770

+0

\t

+2

Вы должны передать переменную 'рестораны' в' filter() 'или она выдает ошибку. –

ответ

0
var el = restaurants.restaurant[i]; 

Вы выбираете элемент [I] из restaurants.restaurant, которая не определена, поскольку restaurants ваш массив и restaurant является объектом, который содержится во всех элементах массива.

Использование

var el = restaurants[i].restaurant; 

При этом он показывает

JSON.stringify(filter(restaurants,"burger","coke")) 
"[{"name":"McDonald's","food":"burger","drink":"coke","content":"Lorem ipsum dolor sit amet"}]" filter(restaurants, "burger","coke") 
1

Существует ошибка в этой строке

var el = restaurants.restaurant[i]; 

Он должен быть

var el = restaurants[i].restaurant; 

JsBin Example

Я рекомендую использовать lodash для обработки массивов. Это упростит ваш код. JsBin Example with lodash

+0

'restaurants.restaurant' на самом деле ничего не значит, что« рестораны »- это массив, в котором нет« ресторана ». 'restaurants [i]' - это элемент 'i'th массива, который содержит объект с ключом' restaurant'. – ikrabbe

+0

Почему вы рекомендуете iodash обрабатывать массивы? Было бы лучше узнать, как обращаться с объектами и массивами в стандарте сценария ECMA, прежде чем кто-то использует инструменты высокого уровня, которые скрывают какие-либо внутренние компоненты от программиста. https://en.wikipedia.org/wiki/ECMAScript – ikrabbe

+0

ikrabbe, спасибо, я пропустил «[i]». Я думаю, что хорошо знать о таких библиотеках, как lodash, и использовать их в проектах, чтобы не изобретать колесо – David

0

restaurants - массив, и вы должны получить доступ к его элементу с index не с недвижимостью. Рабочий код:

var restaurants = [ 
     {"restaurant" : { "name" : "McDonald's", "food" : "burger",  "drink" : "coke", "content" : "Lorem ipsum dolor sit amet" }}, 
     {"restaurant" : { "name" : "KFC", "food" : "chicken", "drink" : "pepsi", "content" : "Lorem ipsum dolor sit amet" }}, 
     {"restaurant" : { "name" : "Pizza Hut", "food" : "pizza", "drink" : "sprite", "content" : "Lorem ipsum dolor sit amet" }}, 
     {"restaurant" : { "name" : "Dominos", "food" : "pizza", "drink" : "root beer", "content" : "Lorem ipsum dolor sit amet" }}, 
     {"restaurant" : { "name" : "Popeyes", "food" : "chicken", "drink" : "mist", "content" : "Lorem ipsum dolor sit amet" }} 
     ]; 

function filter(restaurants, food, drink) { 
    var result = []; 
    for(var i= 0, len = restaurants.length; i < len; i++) { 
     var el = restaurants[i].restaurant; // changed here from - var el = restaurants.restaurant[i]; 
     if(el.food === food && el.drink === drink) { 
      result.push(el); 
     } 
    } 
    return result; 
    } 

filter(restaurants,"burger","coke");