奇怪的索引问题

Weird indexOf issue

本文关键字:问题 索引      更新时间:2023-09-26

如果没有数百行代码,将很难解释这一点,但我会尝试!

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

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 是否在"选定范围"中绘制自己的选项元素

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;
}

当选择范围作为选定范围=[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 在 1,2,3 结果 0

但是,读取值并重新绘制会给出

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

我怀疑存在某种数据类型问题,但几个小时以来一直在对此进行猛烈抨击。任何帮助表示赞赏。

jQuery会给你一个字符串数组,你使用parseIntthis.data.id转换为数字,所以它们永远不会匹配,因为indexOf比较是严格的。

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

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

或者另一种解决方案是将数组保留为字符串,但摆脱parseInt并执行此操作。

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

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

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

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