2014-02-11 3 views
0

При наличии простой булево, просто использовать его в состоянии:Проверьте элемент массива верно

var running = true; 
if(running) {/*do something*/} 

Есть ли какой-то трюк, чтобы сделать это с помощью boolen массива? что-то вроде этого:

var running = [false,false,true,false]; 
if(running[]){/*do something*/} 

В настоящее время я делаю это так:

var uploading = false 
      for(i=0; i< running.length ; i++) 
      { 
       if(running[i]) uploading = true; 
      } 

      if(uploading) 

Но я чувствую, что это на самом деле не полностью написанный код и что их может быть какой-то подвох, сокращенная метод .. может быть простой JavaScript, может быть Jquery

ответ

5

JQuery имеет $.inArray метод:

uploading = $.inArray(running, true) !== -1; 

Имя немного вводит в заблуждение, оно возвращает индекс элемента, который соответствует (-1, если он не указан).

JavaScript имеет Array#indexOf, но он отсутствует в IE8 и ранее:

uploading = running.indexOf(true) !== -1; 

JavaScript от ES5 имеет метод Array#some, но это перебор, если вы можете искать конкретное значение с любым из указанных выше. Тем не менее, это полезно, если вам нужно массировать значения вообще. Например, если «truthy» значение в порядке, а не конкретно true:

uploading = running.some(function(entry) { return !!entry; }); 
+0

Легко включить полис для [Array.prototype.indexOf] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf). – RobG

+0

@RobG: Это действительно так, но если вы уже используете jQuery ... –

1

Вы можете просто использовать это:

uploading = running.indexOf(true) !== -1; 

Если массив не содержит true, indexOf вернется - 1, что приводит к false от !== -1. Если массив содержит true, indexOf вернет его индекс, в результате получится true.

немного короче вариант:

uploading = !!~running.indexOf(true); 

~ является побитовое НЕ, это инвертирует значение из IndexOf: -1 -> 0, 0 -> -1, 1 -> -2, etc. Затем double ! сначала передает это значение в логическое значение, а затем инвертирует его снова, в результате получается логический вывод true, тогда массив содержит true.

+0

'uploading = !! ~ running.indexOf (true)', если вы хотите получить логический результат – elclanrs

+1

или 'running.indexOf (true)> - 1'. – undefined

+0

Да, если 'index' является' 0', это все равно 'false'. А '! =' Или какой-то другой оператор, по-видимому, необходим. – Cerbrus

0

Я просто подумал о маленькой хитрости, которые могут работать в этой ситуации:

uploading = !!Math.max.apply(null, [false, true, false, false]); // => true 

В основном без !! пути вы получите 1 (если есть по крайней мере один true) или false (для всех false в массиве) , Max вызывает ToNumber для каждого переданного аргумента, поэтому true =>1.

Примечание: вам лучше использовать indexOf, это просто для удовольствия и продемонстрировать еще один неочевидный способ.

+0

_JavaScript, wat r u doin? JavaScript, stahp! _ Я понятия не имел, что это было даже близко к возможному: D – Cerbrus

+0

Я знаю, это глупо. Но смешно. – dfsq

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