奇怪的indexOf问题

时间:2012-08-16 15:34:08

标签: javascript jquery indexof

在没有数百行代码的情况下很难解释这一点,但我会尝试!

我有一个父对象,其中包含一个子对象数组。父级使用此函数将MULTIPLE选择元素写入页面

function writecollectionmultiselect(name,displayname,selectedrange){    

// Create select page element
var collection = $("<select/>");
collection.attr("name",name);
collection.attr("MULTIPLE","multiple");

// Loop over elements in this collection and ask them to draw themselves
for(var i=0; i<this.objectarray.length;i++){
    collection.append(this.objectarray[i].writemultioption(selectedrange));
}
return collection;
}

父母要求每个孩子绘制自己的选项元素,具体取决于他们的id是否在“selectedrange”

function writemultioption(selectedrange){
    var option = $("<option/>");
    option.val(this.data.id);
option.html(this.data.name);
if(selectedrange.indexOf(parseInt(this.data.id)) >= 0){
    option.attr('selected', 'selected');
}
return option;
}

当selectedrange作为selectedrange = [1,2,3]提供时,这很好用 但是,如果我使用jquery

读取页面元素的选定值
selectedrange = $('[name='+myname+"]").val();

当我尝试调用第一个函数时,indexOf函数似乎完全失败了。我添加了这行调试代码

alert("looking for "+this.data.id+" in "+selectedrange+" result "+selectedrange.indexOf(parseInt(this.data.id)))

当我第一次画选择器时,我得到了这个:

在1,2,3结果0中寻找1

但是,读取值并重新绘制会产生

在1,2,3结果-1中寻找1

我怀疑某种数据类型的问题,但几个小时以来我一直在抨击这个问题。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:1)

jQuery会为您提供一系列字符串,并且您使用this.data.idparseInt转换为数字,因此它们永远不会匹配,因为indexOf比较是严格的。

一种解决方案是将字符串数组转换为数字。

selectedrange = $.map($('[name='+myname+"]").val(), function(n) { 
                                                        return parseInt(n, 10);
                                                    });

或者另一个解决方案是将数组保持为字符串,但除去parseInt并执行此操作。

if(selectedrange.indexOf(this.data.id) >= 0){

答案 1 :(得分:0)

indexOf()函数将String作为参数,在您的示例中,您传入一个整数,不要调用parseInt()

alert("looking for " + this.data.id + " in " + selectedrange + "result" + selectedrange.indexOf(this.data.id))
                                                                                      // no parseInt() here

另外,获得-1的原因是indexOf()函数在它正在搜索的字符串中找不到匹配项时返回-1