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

Posted

技术标签:

【中文标题】使用 jquery inarray() 搜索字符串变量返回 -1【英文标题】:Searching for a string variable with jquery inarray() returns -1 【发布时间】:2012-04-13 18:43:43 【问题描述】:

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

我做错了什么?

【问题讨论】:

我不明白...请解释...我试图将字符串转换为对象 这里***.com/questions/86513/… 好的,谢谢您的提示...将字符串转换为对象的替代方法是什么? 【参考方案1】:

这可能无法帮助您解决有关 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 awesome 文章很好地详细解释了它。

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:
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
            

        );

【讨论】:

我希望你正在寻找这个。它只是从给定的数组中找到单词 data 并在找到数据时显示它的索引

以上是关于使用 jquery inarray() 搜索字符串变量返回 -1的主要内容,如果未能解决你的问题,请参考以下文章

Jquery遍历数组之$.inArray()方法介绍

JQuery判断数组中是否包含某个元素$.inArray("元素字符串", 数组名称);

jQuery.inArray(),如何正确使用?

使用jQuery $ .inArray

如何使用 jQuery.inArray 方法选择一组唯一的随机数(不重复)?

$.inArray()