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従来のfororループを使用すると、その時点でwhile呼び出すことができます。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 に答える