2014-02-05 2 views
0

У меня есть массив javascript продукта, который содержит всю информацию о продуктах. Создал функцию, которая выполняет итерацию по этому массиву и находит продукт по идентификатору.Функция Javascript, возвращающая ложный даже найденный объект

var products = JSON.parse('[{"Product":{"id":"1","name":"My Product","description":"This is my new product","price":"10.00","currency":"$","stock":"0","image":"/image1.png"}},{"Product":{"id":"5","name":"Dummy Product 2","description":"Some dummy text goes here.","price":"10.00","currency":"$","stock":"100","image":"image2.jpg"}}]'); 

$(document).ready(function(){ 
    console.log(products); 
    alert(findProduct(5)); //it will returns false everytime, evan it has matching product 
}); 

function findProduct(product_id){ 
    $.each(products, function(k, v){ 
     if(v.Product.id == product_id){ 
      console.log(v); 
      return products[k]; //or return 'v' 
     } 
    }); 
    return false; 
} 

Проверить это Demo

Функция возвращает ложь каждый раз, даже если он нашел идентификатор продукта соответствия, не знаю, почему? Если я храню соответствующий массив в переменной, и после итерации верните значение этого ключа, он вернет правильный объект. Но это не так, потому что я хочу остановить итерацию и вернуть значение, если объект найден.

ответ

1

Вы всегда возвращаются фальшь findProduct, если элемент найден вы возвращаете из метода $.each() обратного вызова, но это не отражается в значении, возвращаемом методом findProduct.

function findProduct(product_id) { 
    var found = false; 
    $.each(products, function (k, v) { 
     if (v.Product.id == product_id) { 
      console.log(v); 
      found = products[k]; 
      //return false to prevent further iteration 
      return false; 
     } 
    }); 
    return found; 
} 
1

Используйте вместо этого:

function findProduct(product_id){ 
    var result = false; 
    $.each(products, function(k, v){ 
     if(v.Product.id == product_id){ 
      console.log(v); 
      result = products[k]; //or return 'v' 
      return; 
     } 
    }); 
    return result; 
} 

И вот проблема:

function findProduct(product_id){ 
    $.each(products, function(k, v){ 
     if(v.Product.id == product_id){ 
      console.log(v); 
      return products[k]; //returns from the $.each callback 
     } 
    }); 
    return false; 
} 
+1

'return result;' может быть? – Tony

+0

Да, исправлено. Спасибо за примечание. –

0

Нет необходимости в каждой функции jQuery. Используйте библиотеки только тогда, когда они необходимы.

Проблема в том, что метод «каждый» является фактически ДРУГОЙ функцией. Возвращение из него ничего не значит для функции findProduct.

function findProduct(product_id){ 
    for(var k in products){ 
     var product = products[k]; 
     if(product && product.Product && product.Product.id == product_id) 
      return product; 
    } 
    return false; 
} 
Смежные вопросы