3
// temp data
var array = [1,2,function() { }, 3, function() { }];
var cb = function() { console.log("foo"); }


var found = false;
console.log(_.map(array, function(val) {
    if (_.isFunction(val) && !found) {
        return found = true, _.compose(cb, val);
    } 
    return val;
}));

这循环遍历数组并将找到的第一个函数转换为组合函数。

我讨厌那个found = false变量/计数器。我该如何摆脱它?

作为算法。

let found be 0
map value in array
    if value satisfies condition and found is 0
        let found be 1
        return mutate(value)
    else
        return value

更新

使用 for 循环

for (var i = 0; i < array.length; i++) {
    if (_.isFunction(array[i])) {
        array[i] = _.compose(cb, array[i]);
        break;
    }
}

_.map, _, _.isFunction,_.compose

4

2 回答 2

3

我不知道这是否满足了您对优雅的需求,但在我看来,在找到该项目后,它似乎_.each()或正在浪费额外的循环。forEach使用传统的fororwhile循环,您可以break在此时调用。对小数组来说没什么大不了的,但对于更大的数组或复杂的条件检查来说,它可能会成为一个问题。如果你想避免不断的array[x]引用,你可能会比明显的选择更花哨:

for (var val, x=0; x<array.length; val=array[++x]) {
    if (_.isFunction(val)) {
        array[x] = _.compose(cb, val);
        break;
    }
}
于 2011-05-16T22:22:00.153 回答
1

假设短路评估:(我立即混蛋)

let found be 0
for each value in array
    if value satisfies condition and found is 0 and let found be not found
        let value be mutate(value)

编辑问题,编辑答案:

let found be 0
for each value in array
  return ( value satisfies condition and found is 0 and let found be not found ) ? mutate(value) : value
于 2011-05-16T21:55:22.660 回答