Map 函数式编程:过滤然后映射的术语?

Map 函数式编程:过滤然后映射的术语?,map,filter,functional-programming,Map,Filter,Functional Programming,有时我发现自己想要过滤一个集合,然后映射结果 例如,在JavaScript中: var completedStepIds = steps.filter(function(step) { return step.isComplete; }).map(function(step) { return step.id; }); 或者在C#/LINQ中: 在这个过滤器的功能术语中,有一个术语,然后映射组合吗?我想您需要列表理解: [f(x) | x <- list, g(x)] #

有时我发现自己想要过滤一个集合,然后映射结果

例如,在JavaScript中:

var completedStepIds = steps.filter(function(step) {
    return step.isComplete;
}).map(function(step) {
    return step.id;
});
或者在C#/LINQ中:


在这个过滤器的功能术语中,有一个术语,然后映射组合吗?

我想您需要列表理解:

[f(x) | x <- list, g(x)] # Haskell
[f(x) for x in iterable if g(x)] # Python
另一方面,原型根本不过滤(这是正统的做法,地图不应减少):

我不知道您使用的是哪个库,但您可以编写自己的抽象,从映射中清除空/未定义:

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

我不知道它是否是官方的,但我想到了“apply if”(应用如果),没有必要创造一个新的术语,因为函数组合基本上是用于这个通用的(即Haskell中的(map f.filter p))特别是,正如@tokland很好地指出的,频繁出现的filter和map的组合通常被写成列表理解。
> $.map([1,2,3], function(x) { return x != 2 ? 2 * x: null })
[2, 6]
> [1,2,3].map(function(x) { return x != 2 ? 2 * x: null })
[2, null, 6]
steps.map_and_filter(function(step) {
    return step.isComplete ? step.id : null;
})