使用jquery inarray()搜索字符串变量将返回-1

时间:2012-03-30 04:10:57

标签: jquery arrays string

我正在尝试在数组中搜索字符串。如果该字符串匹配,我想知道该数组中的哪个索引号具有匹配的字符串。我相信我应该使用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 个答案:

答案 0 :(得分:2)

这可能无法帮助您解决有关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范围,因为这篇文章已经太长了,但是this很棒的文章很好地解释了它。

答案 1 :(得分:1)

我不确定通过查看你的代码我完全明白你要做什么,但我认为整个方法有点怪异WET,我可能会重新思考整个事情。您有一些严重的语法错误;许多;声明中放错了var。在条件块中声明变量也不是一个好主意。来自jslint - &gt; eval === evil

答案 2 :(得分:1)

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
            }

        });