Сделайте простой алгоритм поиска более элегантным - PullRequest
3 голосов
/ 17 мая 2011
// 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

Ответы [ 2 ]

3 голосов
/ 17 мая 2011

Я не знаю, отвечает ли это вашей потребности в элегантности, но мне кажется, что _.each() или forEach тратит лишние циклы после того, как предмет найден.С традиционным циклом for или while вы можете вызвать break в этот момент.Ничего страшного в небольшом массиве, но это может стать проблемой для большого массива или сложной проверки условий.Если вы хотите избежать постоянных ссылок array[x], вы можете получить немного более изящный, чем очевидный вариант:

for (var val, x=0; x<array.length; val=array[++x]) {
    if (_.isFunction(val)) {
        array[x] = _.compose(cb, val);
        break;
    }
}
1 голос
/ 17 мая 2011

при условии оценки короткого замыкания: (что я быстро убью)

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
...