Функция $ .inArray не возвращает «-1», если элемент отсутствует

0

Пожалуйста, взгляните на этот FIDDLE. Почему элемент B не возвращает -1 если у него нет значения "клейковины" в строке без allergyfree?

Здесь файл JSON:

[{"title":"A","allergyfree":"sugar,salt,yeast,wheat,gluten"},{"title":"B","allergyfree":"sugar,salt,starch,yeast,wheat,preservatives"}]

Автор сценария:

$.ajax({
    url: "url.json",
    success: function (data) {

        $(data.query.results.json.json).each(function (index, item) { 
         var title = item.title;
         var allergyfree = item.allergyfree;           
         if(allergyfree.length !== 0) {

           allergyfree = allergyfree.split(",");

           $.each(allergyfree,function(i,allergy){

            $('.'+title+allergy).append(jQuery.inArray(allergy, allergyfree));

           });
          }

        });
    },
    error: function () {}
});

Я задаю этот вопрос, потому что у меня есть проблема, чтобы проверить, присутствует ли значение в этом потоке, и кто-то предлагает использовать функцию inArray, но он не работает.

  • 0
    @WesleyMurch, это просто демонстрация, чтобы узнать, действительно ли он возвращает число, когда значения отсутствуют. Я хочу выяснить, почему это утверждение, if ($.inArray(allergy,allergyfree)!=-1) не работает, как ожидалось.
Теги:
arrays

1 ответ

1
Лучший ответ

Если вы отлаживаете (или просто смотрите на ответ), вы обнаружите, что ваш запрос ajax не возвращает запись для B и gluten. Поэтому inArray никогда не призывает к сочетанию title и allergy. Вот почему место для этого осталось пустым.

Фактически, ваш код гарантирует, что у вас никогда не будет случая, когда inArray не найдет запись. Вы ищите каждый элемент в массиве внутри того же массива. Таким образом, элемент всегда будет найден.


Вместо этого вы должны перебирать список всех аллергии, о которых вы заботитесь, и затем проверять их в результате вашего запроса. Что-то вроде этого:

var allergies = ["gluten", "yeast"];

$.ajax({
    /* ... */

    $.each(allergies,function(i,allergy){
        $('.'+title+allergy).append(jQuery.inArray(allergy, allergyfree));
    });

    /* ... */
});

http://jsfiddle.net/cYFLe/119/

  • 0
    Спасибо. Есть ли еще способ сделать оператор if, например if($.inArray(allergy,allergyfree) !== null) {$('.'+title+allergy).html('Yes') } else {$('.'+title+allergy).html('No') } чтобы при отсутствии gluten в B показывалось "Нет"?
  • 1
    @ user35295 Ответ обновлен, чтобы объяснить, как сделать то, что, по моему мнению, вы пытаетесь сделать.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню