Подтвердить что ты не робот

Javascript indexOf не работает как ожидалось с массивом

Я получаю -1 из myarray.indexOf(element), даже если элемент находится в myarray.

Вот некоторые фрагменты кода:

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 предназначен для строк, а не массивов, но это неверно из онлайн-документов, которые я могу найти.

4b9b3361

Ответ 1

Используйте

nds.indexOf(parseInt(el,10)) 

где nds - массив, а el - число (или должно быть числом)

Edit:

Из msdn:

JavaScript - это свободно напечатанный язык, что означает, что вы не объявляете типы данных переменных явно. Во многих случаях JavaScript автоматически выполняет преобразования, когда они необходимы. Например, если вы добавите число в элемент, состоящий из текста (строки), число преобразуется в текст.

И я предполагаю, что такое преобразование было причиной возврата indexOf -1, потому что один из ваших массивов содержал число и другую содержащуюся строку.

Например:

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

Ниже я попытаюсь ответить на ваши вопросы:

Почему indexOf() не работает?

Это работает, и я думаю, это сработало и в вашем случае. Он возвратил -1, когда строка el, например "100", не была найдена в массиве чисел, например. 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

Чтобы увидеть все вышеперечисленное в действии:

проверьте приведенный ниже фрагмент кода, но знайте 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) в массиве, он возвращает вам индекс значения в массиве.

> 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

Вы должны проверить, что вы получаете от el с помощью typeof (el)