发布于 2026-01-06 0 阅读
0

Map、Filter、Reduce 与 For 循环(语法) Map Filter Reduce End

Map、Filter、Reduce 与 For 循环(语法)

地图

筛选

减少

结尾

这篇文章的目的并非要评判哪种范式更好,而只是为了展示一些常见的命令式模式及其功能等效形式。

有时,如果能将新事物与你已经熟悉的事物联系起来,并得到一份来回转换的路线图,学习起来就会更容易。

之前,我曾在 JavaScript 的函数式编程模式与命令式编程模式的文章中做过类似的事情。

地图

map接受一个列表,并对列表中的每个元素运行一个函数,返回相同长度的列表。

至关重要的

const double = x => x * 2
const input = [ 1, 2, 3 ]
const output = []
for (let i = 0; i < input.length; i++) {
  output.push(double(input[i]))
}

output //=> [ 2, 4, 6 ]
Enter fullscreen mode Exit fullscreen mode

功能

const double = x => x * 2
const input = [ 1, 2, 3 ]
const output = input.map(double)

output //=> [ 2, 4, 6 ]
Enter fullscreen mode Exit fullscreen mode

筛选

filter接受一个列表作为参数,并返回一个包含所有与谓词匹配的项的列表。在本例中,isEven谓词为 `$($)`。

至关重要的

const isEven = x => x % 2 === 0
const input = [ 1, 2, 3, 4, 5 ]
const output = []
for (let i = 0; i < input.length; i++) {
  if (isEven(input[i])) {
    output.push(input[i])
  }
}

output //=> [ 2, 4, 6 ]
Enter fullscreen mode Exit fullscreen mode

功能

const isEven = x => x % 2 === 0
const input = [ 1, 2, 3, 4, 5 ]
const output = input.filter(isEven)

output //=> [ 2, 4, 6 ]
Enter fullscreen mode Exit fullscreen mode

减少

reduce接受一个列表作为参数,并返回任意数据结构。它可以是另一个列表,也可以是一个对象。

简单的

至关重要的

const add = (x, y) => x + y
const input = [ 1, 2, 3 ]
const initial = 0
let output = initial
for (let i = 0; i < input.length; i++) {
  output = add(output, input[i])
}

output //=> 6
Enter fullscreen mode Exit fullscreen mode

功能

const add = (x, y) => x + y
const input = [ 1, 2, 3 ]
const initial = 0
const output = input.reduce(add, initial)

output //=> 6
Enter fullscreen mode Exit fullscreen mode

复杂的

至关重要的

const isEven = x => x % 2 === 0
const double = x => x * 2
const input = [ 1, 2, 3, 4, 5 ]
const initial = []

let output = initial
for (let i = 0; i < input.length; i++) {
  if (isEven(input[i])) {
    output.push(double(input[i]))
  }
}

output //=> [ 4, 8 ]
Enter fullscreen mode Exit fullscreen mode

功能

可以像下面这样写,但要注意它会遍历数组两次。

const isEven = x => x % 2 === 0
const double = x => x * 2
const input = [ 1, 2, 3, 4, 5 ]
const initial = []

let output =
  input
    .filter(isEven)
    .map(double)

output //=> [ 4, 8 ]
Enter fullscreen mode Exit fullscreen mode

或者,您可以创建一个 reducer,在一次迭代中filter同时实现这两个功能。map

const isEven = x => x % 2 === 0
const double = x => x * 2
const input = [ 1, 2, 3, 4, 5 ]
const initial = []

const reducer = (filter, map) => (acc, x) => {
  if (filter(x)) {
    acc.push(map(x))
  }
  return acc
}

const output = input.reduce(reducer(isEven, double), initial)

output //=> [ 4, 8 ]
Enter fullscreen mode Exit fullscreen mode

结尾

我目前可以承接兼职合同工作(C#、JavaScript、React)。请通过TwitterLinkedIn联系我。

我的文章大量运用了函数式 JavaScript,如果您需要更多函数式编程方面的知识,请在这里或在 Twitter 上关注我@joelnet

更多文章:
解构 Map、Filter 和 Reduce;
问我一些关于函数式编程的傻问题;
让我们一起打造一个 DEV.to CLI;
我们来聊聊 JavaScript 的自动生成文档工具。

干杯!

文章来源:https://dev.to/joelnet/map-filter-reduce-vs-for-loops-syntax-2k5l