23

myarray.indexOf(element)要素がmyarrayにあるように見えても、-1を取得しています。

コードスニペットは次のとおりです。

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が含まれていない場合にのみ真になります。

私の場合、特定の問題を特定するのに十分な情報を提供していないことは知っていますが、誰かがこの動作を引き起こす可能性のある一般的な理由を教えてくれるかもしれません。

indexOfの代わりにjQueryinArray()を使用することを提案した同様の質問への回答ですが、indexOfが機能しない理由を知りたいです。他の人は、indexOfは配列ではなく文字列用であると示唆しましたが、私が見つけたオンラインドキュメントからはそうではありません。

4

5 に答える 5

35

使用する

nds.indexOf(parseInt(el,10)) 

nds配列でel、数値です (または数値であるはずです)。

編集:

msdnから:

JavaScript は緩やかに型付けされた言語です。つまり、変数のデータ型を明示的に宣言しません。多くの場合、JavaScript は必要に応じて自動的に変換を実行します。たとえば、テキスト (文字列) で構成されるアイテムに数値を追加すると、その数値はテキストに変換されます。

そして、配列の1つに数値が含まれ、他の配列に文字列が含まれていたため、このような変換がindexOf返された理由だと思います。-1

例えば:

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

以下は、あなたの質問に答える私の試みです:

indexOf() が機能しないのはなぜですか?

それはうまくいきますし、あなたの場合でもうまくいったと思います。文字列 (例: ) が数値の配列 (例: true) で見つからない-1場合に返されます。文字列は数値と同じではないためです。el"100"nds=[100,200]"100"100

indexOf() は文字列、配列などで機能しますか?

はい、indexOf()文字列だけでなく、配列 (数値、文字列、または任意のオブジェクト) でも機能します。ただし、同じタイプで確認する必要があります。

parseInt() は何をしますか?

数値と文字列の意図しない比較を避けるために、 を使用できます。parseInt()たとえばparseInt("123", 10)、数値を返します123

2 番目の引数はradix10と呼ばれます。使用する数値システムを表す数値 (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

上記のすべての動作を確認するには:

以下のコード スニペットを確認してください。ただし、実行するときは注意し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 );

于 2013-10-20T21:28:25.087 に答える
2

配列でindexOf( value )を使用すると、配列内の値のインデックスが返されます。

> 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から取得したものを確認する必要があります

于 2013-01-08T20:12:28.840 に答える
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

このエラーが発生した場合は、ソースと宛先を混同したか (ドットの前の配列が検索されている)、別の微妙なプログラミング エラーが発生している可能性があります (考えている配列を比較していないなど)。比較しています)。

于 2013-01-08T19:57:08.173 に答える