javascript - 함수 - 자바스크립트 findindex




자바 스크립트 indexOf 배열로 예상대로 작동하지 않습니다. (3)

배열에서 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 )으로 에서 얻은 것을 확인해야합니다.

요소가 myarray에있는 것처럼 보이는 경우에도 myarray.indexOf(element) 에서 -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 대신 jQuery inArray ()를 사용하여 제안했지만 indexOf가 작동하지 않는 이유를 알고 싶습니다. 다른 사람들은 indexOf가 배열이 아니라 문자열을위한 것이라고 제안했지만, 그것은 내가 찾을 수있는 온라인 문서에서 사실이 아닙니다.


용도

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기수 라고합니다. 사용할 숫자 체계를 나타내는 숫자 (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 );


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

이 오류가 발생하는 경우 소스와 대상 (점이 검색되기 전에 배열)이 섞여 있거나 다른 미묘한 프로그래밍 오류가있는 것입니다 (생각한 배열을 비교하지 않은 것 같습니다) 당신은 비교하고있다).





indexof