Ayeesha Sherin
Ayeesha Sherin

Reputation: 3

json array search in javascript

I am dealing with a json array and performing search on it. The code seems to be ok but not giving the output. This is my code

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" }}
      ];

And my method for search is

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;
}

But in console it is showing Uncaught TypeError: Cannot read property 'length' of undefined. What is wrong with the function? How can i perform a complete search? Is it about string length function?

Upvotes: 0

Views: 148

Answers (3)

David
David

Reputation: 61

There is an error in this line

var el = restaurants.restaurant[i];

It has to be

var el = restaurants[i].restaurant;

JsBin Example

I recommend your to use lodash to handle arrays. It will make your code simpler. JsBin Example with lodash

Upvotes: 1

SK.
SK.

Reputation: 4358

restaurants is an array and you have to access the element of it with index not with property. Working code:

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");

Upvotes: 0

ikrabbe
ikrabbe

Reputation: 1929

var el = restaurants.restaurant[i];

You choose element [i] of restaurants.restaurant which is undefined because restaurants is your array and restaurant is the object that is contained in all array elements.

Use

var el = restaurants[i].restaurant;

With this it shows

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

Upvotes: 0

Related Questions