Reputation: 3
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
Reputation: 61
There is an error in this line
var el = restaurants.restaurant[i];
It has to be
var el = restaurants[i].restaurant;
I recommend your to use lodash to handle arrays. It will make your code simpler. JsBin Example with lodash
Upvotes: 1
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
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