2014-09-07 3 views
1

У меня есть эти два массива:функция Javascript IndexOf возвращает неверные результаты

array1 = ["a,1", "b,2", "c3", "d4", "e5", "f6"]; 
array2 = [1, 2, 3, 4]; 

И я пытаюсь выяснить, если элемент первого массива во втором.

for (i = 0; i < array1.length; i++) { 
    if(array2.indexOf(array1[i][1]) != -1) { 
    console.log('In array: '+array1[i][1]); 
    } else { 
    console.log('NOT in array: '+array1[i][1]); 
} 

В этом случае, я всегда получаю сообщение НЕ в массиве ...

Но если я изменить код таким образом:

for (i = 0; i < array1.length; i++) { 
    if(array2.indexOf(1) != -1) { 
    console.log('In array: '+array1[i][1]); 
    } else { 
    console.log('NOT in array: '+array1[i][1]); 
} 

Выход на В массиве: ....

С номером в качестве параметра функции indexOf() он работает, но нет с переменной ... как это возможно?

Спасибо

+2

'array1 [i] [1]' is '", "' или 'undefined', в зависимости от браузера. – SLaks

+2

Вы сравниваете строку с числом, поэтому они никогда не будут совпадать. Ваш '+' исправляет эту проблему. Я предполагаю, что индекс '[1]' ошибочно принят в вашем рабочем примере. –

+1

'' 3 "' это не то же самое, что '3', а' ',' 'определенно не то же самое, что' 1'. – JLRishe

ответ

0

В коде:

if(array2.indexOf(array1[i][1]) != -1) { 

сравнивает строку в число, используя строгое сравнение каждого алгоритма indexOf. Кроме того, в большинстве случаев вы сравниваете неправильный символ от array1. В:

"a,1" 

знак 1 - это запятая, а не номер. Что вам нужно сделать, это получить число из строки в array1, конвертировать их числа типа так IndexOf работ с использованием выражения, как:

+array1[i].replace(/\D/g,'') 

затем сделать сравнение, например:

array1 = ["a,1", "b,2", "c3", "d4", "e5", "f6"]; 
array2 = [1, 2, 3, 4]; 


for (var i=0, iLen=array1.length; i<iLen; i++) { 
    if (array2.indexOf(+array1[i].replace(/\D/g,'')) != -1) { 
     console.log('In array: ' + array1[i]); 
    } else { 
     console.log('Not in array: ' + array1[i]); 
    } 
} 

// In array: a,1 
// In array: b,2 
// In array: c3 
// In array: d4 
// Not in array: e5 
// Not in array: f6 

Возможно, вам потребуется изменить регулярное выражение, получающее номера, в зависимости от полного диапазона строк, которые могут быть в array1.

Альтернатива заключается в преобразовании членов массив2 в строки и искать их в члены array1.

Смежные вопросы