2016-08-17 9 views
1

Можно ли использовать несколько аргументов при определении indexOf на массиве?indexOf с несколькими аргументами

Я хочу определить, содержит ли мой массив любое из трех целых чисел. Важно отметить на этом этапе, что массив будет только имеют одно значение (если он больше, он не достигнет этого кодового блока).

array.indexOf(123 || 124 || 125) === 0 

Так что если array = [123] тогда мой indexOf должен быть 0 и поэтому true.

Если array = [124], то мой indexOf должен быть 0 и, следовательно, true.

То, что я нахожу, происходит [123] работает нормально, но он даже не потрудился проверить indexOf для 2-го или 3-го аргументов и просто возвращает false.

http://codepen.io/anon/pen/WxmyGp?editors=0011

+3

Это не имеет большого смысла для 'indexOf' принять несколько аргументов, например 'indexOf (1, 2, 3)', потому что в * общем случае *, каков должен быть результат, если в массиве существует несколько элементов ...? – deceze

+0

Если вы открыты для использования lodash, ознакомьтесь с ответом здесь: http://stackoverflow.com/questions/29416454/lodash-hasintersection – adam0101

ответ

10

|| оператор возвращает левую часть, если это правда, в противном случае она возвращает правую сторону. 123 || 124 || 125 только что означает 123.

Если вы хотите проверить, имеется ли какое-либо из нескольких значений в массиве, вам необходимо каждый раз протестировать каждый.

array.indexOf(123) == 0 || array.indexOf(124) == 0 || array.indexOf(125) == 0 

Так как вы только заботиться о один конкретный индекс массива, вы можете превратить все это на голову:

[123, 124, 125].indexOf(array[0]) > -1 
+1

@dave Оба имеют сложность 'O (m * n)'. У вашего подхода просто есть выражения 'm', соединенные' || 's. Внедрение Quentin, по-видимому, выполняется значительно быстрее, чем ваша в Chrome: https://plnkr.co/edit/yz9VRRJ3D0pIMqbSunJJ?p=preview – JLRishe

+0

@JLRishe, очевидно, эти результаты говорят сами за себя, но мне сложно понять, почему. Я отправил [связанный вопрос] (http: // stackoverflow.com/questions/39006845/how-can-array-indexof-be-more-efficient-than-array-some), чтобы спросить, почему этот подход выполняется быстрее. – dave

3

Вы можете сделать это с помощью Array.some().

Приятная вещь в этом подходе заключается в том, что вам нужно будет только перебирать массив через один раз. Если вы соедините || несколько indexOf(), вы будете продолжать повторять массив с каждым пропущенным поиском.

function checkArray(array) { 
 
    return array.some(function(item) { 
 
    return item == 123 || item == 124 || item == 125; 
 
    }); 
 
}; 
 

 
console.log(checkArray([123, 456, 789])); 
 
console.log(checkArray([456, 789])); 
 
console.log(checkArray([789, 456, 125]));

+0

Если я правильно прочитал Q, решение было бы простым 'array == [123] || array == [124] || array == [125] '. – Boldewyn

+2

@Boldewyn - Нет. '==' проверяет, являются ли обе стороны одинаковыми объектами. Различные массивы не совпадают, даже если они идентичны. – Quentin

+0

@Quentin справа, спасибо! – Boldewyn

-1

Если вы хотите получить несколько результатов еще один способ сделать это Array.prototype.filter(). Bu это вернет вам сами объекты. Если вас интересуют индексы, вы должны объединить его с Array.prototype.reduce(), например;

var a = [1,2,3], 
 
    b = a.filter(e => e === 1 || e === 2) 
 
     .reduce((p,c) => p.concat(a.indexOf(c)),[]); 
 
console.log(b);