Функциональное программирование: термин для фильтрации и отображения? - PullRequest
0 голосов
/ 05 мая 2011

Иногда мне хочется отфильтровать коллекцию, а затем отобразить результаты.

В JavaScript, например:

var completedStepIds = steps.filter(function(step) {
    return step.isComplete;
}).map(function(step) {
    return step.id;
});

Или в C # / LINQ:

var completedStepIds = 
    from step in steps
    where step.IsComplete
    select step.Id
;

Там есть термин на функциональном языке для этого фильтра-затем-картысочетание

1 Ответ

1 голос
/ 12 мая 2011

Полагаю, вам нужны списочные выражения:

[f(x) | x <- list, g(x)] # Haskell
[f(x) for x in iterable if g(x)] # Python

Что ж, jQuery's map работает так, что является скрытым списком:

> $.map([1,2,3], function(x) { return x != 2 ? 2 * x: null })
[2, 6]

С другой стороны, Prototype вообще не фильтрует (что является обычным делом, карта не должна уменьшаться):

> [1,2,3].map(function(x) { return x != 2 ? 2 * x: null })
[2, null, 6]

Я не знаю, какую библиотеку вы используете, но вы всегда можете написать своюсобственная абстракция, которая очищает null / undefined из сопоставления:

steps.map_and_filter(function(step) {
    return step.isComplete ? step.id : null;
})
...