javascript indexOf无法按预期使用数组

Posted

技术标签:

【中文标题】javascript indexOf无法按预期使用数组【英文标题】:javascript indexOf not working as expected with array 【发布时间】:2012-12-22 18:24:02 【问题描述】:

即使元素出现在 myarray 中,我也会从 myarray.indexOf(element) 得到 -1。

这里有一些代码sn-ps:

function createChangeRecord( old_array, new_array ) 
    var nds = new_array.slice(0,new_array.length);
    var el, idx;
    if (...) 
        ...
     else if ( old_array.length==new_array.length ) 
        for ( var i=0; i<old_array.length; i++ ) 
            el = old_array[i];
            idx = nds.indexOf(el);
            if ( idx!=(-1) ) 
                ...
             else 
                var a = "el: " + el + "; nds: " + nds + "; nds.indexOf(el): " + nds.indexOf(el);
                alert( a );
                ...
            
        
        ...
    
    ...

警报显示 nds 确实包含 el,但警报仅应在 idx==-1 时触发,仅当 nds 不包含 el 时才应为真。

我知道我没有提供足够的信息来确定我的案例中的具体问题,但也许有人可以告诉我一些可能导致这种行为的一般原因?

对类似问题的回答建议使用 jQuery inArray() 而不是 indexOf,但我想知道为什么 indexOf 不起作用。其他人建议 indexOf 用于字符串,而不是数组,但我可以找到的在线文档不是这样。

【问题讨论】:

。其他人建议 indexOf 用于字符串,而不是数组,但从我可以找到的在线文档中看并非如此。 indexOf 并非所有浏览器都支持数组。 See the MDN Docs. 即使元素出现在 myarray 中,我也会从 myarray.indexOf(element) 得到 -1。 什么是 element?一个字符串?一个 DOM 节点?一个数字? 顺便说一句,您可以不带参数调用Array.slice() 来复制整个数组,而不是传递0length 旧数组的来源是什么?我遇到了这个问题并使用 Ajeet Shah 的回答解决了它。在我的问题中,要搜索的数组是从 JSON 文件中提取的。这些值是带引号的数字,并且在使用 console.log 进行调试时始终显示为数字。 @Ajeet,我相信我发布这个问题后的第一批回复并没有解决它。特别是您的回复似乎没有回答为什么 IndexOf 不起作用的问题。可能是后来的回复确实解决了我的问题,但老实说,它已经很长时间了,以至于我不确定并且此时无法访问代码。我对不接受任何回复感到难过,但我无法验证正确性。 【参考方案1】:

使用

nds.indexOf(parseInt(el,10)) 

其中nds 是一个数组,el 是一个数字(或应该是一个数字)

编辑:

来自msdn:

javascript 是一种松散类型的语言,这意味着您无需声明 显式变量的数据类型。在很多情况下 JavaScript 需要时自动执行转换。例如, 如果将数字添加到由文本(字符串)组成的项目,则 数字转换为文本。

我猜这种转换是 indexOf 返回 -1 的原因,因为您的数组之一包含数字和其他包含的字符串。

例如:

old_array = ["10", "20", "30"];
new_array = [10, 20, 30];

以下是我尝试回答您的问题:

为什么 indexOf() 不起作用?

它确实有效,我想它也适用于你的情况。 当 el 字符串(例如 "100")在数字数组中找不到时,它返回 -1,例如nds=[100,200] 这是真的。因为"100" 字符串与100 数字不同。

indexOf() 是否适用于字符串、数组等?

是的,indexOf() 可用于数组(数字、字符串或任何对象)以及字符串。但是你必须确保检查相同的类型。

parseInt() 有什么作用?

为了避免数字与字符串的意外比较,我们可以使用parseInt(),例如parseInt("123", 10)返回数字123

第二个参数10 称为radix。一个数字(从 2 到 36),表示要使用的数字系统。

总结:

> "javascript is awesome".indexOf('v')
2
> [10, 20, 30].indexOf("20")
-1
> [10, 20, 30].indexOf(20)
1
> [10, 20, 30].indexOf( parseInt("20", 10) ) 
1
> typeof (100)
number
> typeof ("100")
string
> typeof( parseInt( "100", 10))
number
> parseInt( "100", 10)
100
> parseInt("100", 2)
4
> parseInt(11.3, 10)
11
> parseInt(11.3, 2)
3
> [10.3, 11.3, 12.3, 11].indexOf( parseInt(11.3, 10) )
3

查看以上所有操作:

检查下面的代码 sn-p 但在运行时注意alert();console.log();

function createChangeRecord( old_array, new_array ) 

    var nds = new_array.slice( 0, new_array.length ); // this seems to be redundant
    var el, idx, msg;
    
    if ( old_array.length == new_array.length ) 
        for ( var i=0; i<old_array.length; i++ ) 

            el = old_array[i];
            idx = nds.indexOf(el);

            if ( idx != -1 ) 
                msg = "Found: el: " + el + "; nds: " + nds + "; nds.indexOf(el): " + idx + "\n typeof el: " + (typeof el) + "; typepf nds[" + i + "]: " + (typeof nds[i]);
             else 
                msg = "Not Found: el: " + el + "; nds: " + nds + "; nds.indexOf(el): " + idx + "\n typeof el: " + (typeof el) + "; typepf nds[" + i + "]: " + (typeof nds[i]);
            

            console.log( msg );
            alert( msg );
        
    
    else 
        var err = 'Array lengths are not same';
        console.log( err );
        alert( err );
    


// this will work
var old_array_g = [ 10, 20 ];
var new_array_g = [ 10, 20 ];
createChangeRecord( old_array_g, new_array_g );

// this will not work
var old_array_g = [ "10", "20" ];
var new_array_g = [ 10, 20 ];
createChangeRecord( old_array_g, new_array_g );

// Yes: indesOf works with strings too

var withStrings = "'javascript is awesome'.indexOf('v'): " + "javascript is awesome".indexOf('v');
console.log( withStrings );
alert( withStrings );


// parseInt() returns a number or say integer
var usingParse = "typeof(123): " + typeof( 123 ) + "; typeof( parseInt('123', 10) ): " + typeof ( parseInt('123', 10) ) + "; typeof ('123'): " + typeof('123');
console.log( usingParse );
alert( usingParse );

// parseInt() with base 2
var parseBase2 = "parseInt( '100', 2 ): " + parseInt('100', 2) + "; parseInt( '100' , 10): " + parseInt('100', 10);
console.log( parseBase2 );
alert( parseBase2 );

【讨论】:

我实际上遇到了一个问题,即使值匹配,它也不会从数组中读取整数。这为我解决了这个问题(似乎有点迂回,因为原来的方式在控制台中工作。)【参考方案2】:

indexOf 确实有效,并且按照您所说的去做。

例如(从控制台演示):

> a = [1,2,3,4,5,6,7,8];
  [1, 2, 3, 4, 5, 6, 7, 8]
> b = a.slice(0,a.length);
  [1, 2, 3, 4, 5, 6, 7, 8]
> b.indexOf(a[4])
  4

如果您收到此错误,可能意味着您混淆了源和目标(点之前的数组是正在搜索的数组),或者您有另一个细微的编程错误(例如您没有比较你认为你正在比较的数组)。

【讨论】:

【参考方案3】:

当您在数组上使用 indexOf(value) 时,它会返回数组中 valueindex

> var testArray = ["a","b","c"];
> testArray.indexOf(1)
-1
> testArray.indexOf("b")
1
> testArray.indexOf("c")
2
> testArray = [10,12,3];
> testArray.indexOf(12)
1

你应该用 typeof(el) 来检查你从 el 得到了什么

【讨论】:

【参考方案4】:

以上面的例子为例:

你在哪里idx=nds.indexOf(el)

将其替换为idx=nds.indexOf(''+el+'')

它在我正在做的事情中为我解决了一个类似的问题,但我偶然发现它正在四处寻找解决方案。

它是否在所有情况下都稳定是我无法回答的。

【讨论】:

这个拯救了我的一天。谢谢!【参考方案5】:

如果您的搜索数组包含数字,并且您想要搜索 2"2" 之类的项目

nds = [1, 2, 3, 4, 5];

这行得通(加加号)

nds.indexOf(+el)

【讨论】:

以上是关于javascript indexOf无法按预期使用数组的主要内容,如果未能解决你的问题,请参考以下文章

Vue、Vuex、JavaScript:includes() 无法按预期工作

Javascript FileSystem函数无法按预期工作[重复]

视口元标记在 Android 上无法按预期工作

Javascript:未捕获的 TypeError:无法读取 null 的属性“indexOf”

IFRAME:在 IE 和 Edge 中的悬停无法按预期工作

ng-如果没有按预期工作