Поиск строковой переменной с помощью jquery inarray () возвращает -1 - PullRequest
3 голосов
/ 30 марта 2012

Я пытаюсь найти строку в массиве. Если эта строка совпадает, я хочу знать, какой индекс в этом массиве имеет соответствующую строку. Я считаю, что я должен использовать inArray (); но он всегда возвращает -1

var $eventwrap = $j('.tw-events'),
    $daywrap = $j('.tw-day'),
    $dayfilter = $j('#tw-filter-days li a');
    $daywraphide = $j('tw-day.hide'),
    $catwrap = $j('.tw-event-filter'),
    $viewctrls = $j('.tw-view a'),

    // RELEVANT CODE STARTS HERE

    $clonedays = $j('.select-days').html(),
    $clonebarrio = $j('.select-barrio').html(),
    $clonecats = $j('.select-cats').html(),
    $opday = $clonedays.split("</option>"),
    $opbarrio = $clonebarrio.split("</option>"),
    $opcategory = $clonecats.split("</option>");

    // RELEVANT CODE ENDS HERE

    filters = {};


// CHECK IF A GIVEN DAY HAS EVENTS
function filterToggle(element,x,y) {
    $j(element).each(function(){
        var $me = $j(this),
            isli = $me.is('li');
        if(isli) {
            var myvalue = $me.find('a').attr('data-filter');
        } else {
            // RELEVANT CODE STARTS HERE

            var myselect = $me.parent().attr('data-filter-group'),
                myvalue = $me.attr('data-filter'),
                myfilter = String(myvalue);

            // RELEVANT CODE ENDS HERE

        }

        if(!x) {x = ''}
        if(!y) {y = ''}

        var eventcount = $j('.tw-event'+ myvalue + x + y).length;

        if(eventcount == 0) {
            if(isli) {
                $me.addClass('empty tdn');
            } else {
                $me.remove();
            }
        } else {
            if(isli) {
                $me.removeClass('empty tdn');
            } else {

            // RELEVANT CODE STARTS HERE

                var myarray = eval("(" + '$op' + myselect + ")");

                alert($j.inArray(myfilter,myarray));
            // RELEVANT CODE ENDS HERE
            }
        }
    });
}

Что я делаю не так?

Ответы [ 3 ]

2 голосов
/ 30 марта 2012

Это может не помочь вам решить исходный вопрос о том, что inArray () возвращает -1, но я хотел бы пролить свет на проблемы, на которые указывали другие пользователи.

Альтернативы eval()

  • Если ваши переменные $ op * существуют в глобальной области видимости, вы можете использовать объект окна и обращаться к ним оттуда:

     var myArray = window['$op' + myselect];
    
  • Еще лучше,Вы можете удалить свои переменные из глобальной области видимости, поместив их в модуль.Возможно, попробуйте что-то вроде этого:

    var myNamespace = (function() {
      var $eventwrap = $j('.tw-events'),
      $daywrap = $j('.tw-day'),
      $dayfilter = $j('#tw-filter-days li a'),
    
         ...
    
      $opday = $clonedays.split("</option>"),
      $opbarrio = $clonebarrio.split("</option>"),
      $opcategory = $clonecats.split("</option>");
    
      return {
        opday: $opday,
        opbarrio: $opbarrio,
            ...
        //whatever you need to access externally goes in the return object
      }
    
    })();
    
    //Now you can access these variables like so
    function filterToggle(element,x,y) {
        ...
       var myarray = myNamespace['$op' + myselect];
        ...
    }
    

Объявления переменных

Javascript - это область действия на уровне функций;не заблокирован на уровнеВ языках уровня области действия переменные, объявленные внутри условного блока, являются локальными для этого блока.В JavaScript это не так, и вы можете столкнуться с каким-то странным поведением, таким как подъем переменных.Я не буду вдаваться в подробности о масштабировании JavaScript, поскольку этот пост уже становится слишком длинным, но эта потрясающая статья отлично справляется с подробным объяснением.

1 голос
/ 30 марта 2012
var arrayString = new Array();
        var string = "this is the data to insert in array";
        arrayString = string.split(" ");
        //checking for data in above array
        $.each(arrayString, function(i, val) {
            alert(arrayString[i]);
            if (arrayString[i] == "data") {
                alert(i);//i gives the index of the found element
            }

        });
1 голос
/ 30 марта 2012

Я не уверен, что полностью понимаю, что вы пытаетесь сделать, глядя на ваш код, но я думаю, что весь подход довольно странный и WET , я бы, вероятно, переосмыслил все это. У вас есть серьезные синтаксические ошибки; многие неуместные ; в ваших var декларациях. Также не рекомендуется объявлять переменные внутри условных блоков. Из jslint -> eval === evil.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...