我有两个数组。例如:
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
函数将其拉出来?
答案 0 :(得分:3)
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)
编辑:您似乎需要vals
和bool
的第一个真值。这是一个不需要任何功能的解决方案。
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
}
});