循环数组设置value = vals [0] || vals [1] || jQuery中的vals [2]

时间:2011-09-15 01:00:24

标签: javascript jquery loops each

我有两个数组。例如:

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 个答案:

答案 0 :(得分:3)

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的索引中对values数组进行切片。然后减少切片数组,直到达到第一个真值。

答案 1 :(得分:2)

jQuery.each。重要的部分是:

签名......

  
    

jQuery.each(集合,回调(indexInArray,valueOfElement))

  

......以及如何“打破”:

  
    

我们可以通过使回调函数返回false来打破特定迭代的$ .each()循环。

  
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
   }
})

快乐的编码。

答案 2 :(得分:2)

编辑:您似乎需要valsbool的第一个真值。这是一个不需要任何功能的解决方案。

var value, i = 0;

while( !bool[i] && ++i < bool.length );

while( !(value = vals[i]) && ++i < vals.length );

我误解了这个问题,认为数组需要在相同的索引处真实。现在我看到第一个真正的bool索引只是vals的起点。固定的。


为了解释,我们有两个while循环。在它们两者中,典型的{...}块语句已被;空语句替换。这是因为所有工作都是由(...)

之间的表达式完成的

第一个循环只增加i,直到在bool中找到真值。这会将i设置为第二个循环的起点。

第二个循环与第一个循环的作用相同,只是每次表达式运行时,它都会将当前val[i]设置为value变量。只要value被赋予“假”值,它就会这样做。

这实际上与您的val[0] || val[1] || val[2]部分相同,但它总是从bool循环离开i的任何地方开始。

因此,一旦value获得“真实”值,或i超过vals数组中的最后一个索引,循环就会退出。此时,value将保留找到的“真实”值,如果没有找到,则为undefined


作为一项功能:

DEMO: 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"

答案 3 :(得分:0)

试试这个:

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
    }
});