Массивы циклов для установки значения = vals [0] || vals [1] || vals [2] в jQuery - PullRequest
1 голос
/ 15 сентября 2011

У меня есть два массива. Например:

var bool = [true, false, true];
var vals = ['hi','med','lo'];

Используя jQuery, я хотел бы просмотреть их, чтобы я мог протестировать каждый bool и установить var равным наибольшему доступному значению из массива vals после первого true из bool массив:

var value = ( bool[0] ) ? vals[0] || vals[1] || vals[2] :
                        ( bool[1] ) ? vals[1] || vals[2] : vals[2] ;

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

Ответы [ 4 ]

3 голосов
/ 15 сентября 2011

Как насчет Array.indexOf :

var bool = [true, false, true];
var vals = ['hi','med','lo'];

var result = vals.slice(bool.indexOf(true));

var finalValue = result.reduce(function (a,b) {return a || b} );

Это должно быть отрегулировано для IE8 и ниже, но в этой ссылке есть хорошая прокладка.

РЕДАКТИРОВАТЬ

Таким образом, вырезать массив значений из индекса первого true.Затем уменьшайте нарезанный массив, пока не достигнете первого истинного значения.

2 голосов
/ 15 сентября 2011

РЕДАКТИРОВАТЬ: Похоже, вам нужно первое истинное значение из 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"
2 голосов
/ 15 сентября 2011

См. jQuery.each .Важные части:

Подпись ...

jQuery.each (collection, callback (indexInArray, valueOfElement))

... и как "сломать":

Мы можем разорвать цикл $ .each () на определенной итерации, заставив функцию обратного вызова вернуть false.

var bool = [true, false, true];
var vals = ['hi','med','lo'];
var result
jQuery.each(bool, function (index, val) {
   if (val) { // or val === true or whatever
     // got it, save value, stop iterating
     result = vals[index]
     return false
   }
})

Удачного кодирования.

0 голосов
/ 15 сентября 2011

Попробуйте это:

var goal;
var bools = [true, false, true];
var vals = ['high', 'med', 'lo'];
jQuery.each(vals, function(i, value) {
    if (bools[i] === true) // or use if (bools[i]) but that will also be true for "truthy" non-bools
    {
        goal = value;
        return false; // this breaks from the each loop
    }
});
...