РЕДАКТИРОВАТЬ: Похоже, вам нужно первое истинное значение из vals
и bool
.Вот решение, которое не требует каких-либо функций.
var value, i = 0;
while( !bool[i] && ++i < bool.length );
while( !(value = vals[i]) && ++i < vals.length );
Я неправильно понял вопрос, полагая, что массивы должны быть достоверными при тех же показателях.Теперь я вижу, что первый истинный индекс bool
является лишь отправной точкой для vals
.Исправлено.
Для объяснения у нас есть два while
цикла.В обоих случаях типичный оператор блока {...}
был заменен на оператор ;
empty.Это связано с тем, что вся работа выполняется выражениями между (...)
.
. Первый цикл просто увеличивает i
до тех пор, пока в bool
не будет найдено истинное значение.Это устанавливает i
в качестве начальной точки для второго цикла.
Второй цикл делает то же самое, что и первый, за исключением того, что каждый раз, когда выполняется выражение, он устанавливает текущий val[i]
равным value
переменная.Он делает это до тех пор, пока value
присваивается значение "falsey".
Это фактически то же самое, что ваша деталь val[0] || val[1] || val[2]
, за исключением того, что она всегда начинается везде, где петля bool
оставлена i
.
Таким образом, как только value
получит "истинное" значение или i
превысит последний индекс в массиве vals
, цикл завершится.На этом этапе value
будет содержать либо "истинное" значение, которое было найдено, либо undefined
, если ничего не было найдено.
Как функция:
ДЕМО: http://jsfiddle.net/W9uBb/
function filterValsFromBools(bool, vals) {
var value, i = 0;
while (!bool[i] && ++i < bool.length);
while (!(value = vals[i]) && ++i < vals.length);
return value;
}
var a = filterValsFromBools(
[true, false, true],
['hi', 'med', 'lo']
);
var b = filterValsFromBools(
[false, true, true],
['hi', 'med', 'lo']
);
var c = filterValsFromBools(
[false, true, true],
['hi', 0, 'lo']
);
console.log( a, b, c ); // "hi" "med" "lo"