在函数式编程中基于周围上下文进行过滤或映射的正确/惯用方法是什么?

jnpdx

在函数式编程中,基于单个项的特征进行过滤相对简单——例如,过滤以仅查找奇数:

const arrayOfInfo = [1,2,3,4,5,6,8,10,11,13,15,16,17,19]

const onlyOddNumbers = arrayOfInfo.filter(function(item) {

  return (item % 2 == 1) ? true : false

})

但是,如果我需要上下文,我不确定惯用的做事方式是什么——换句话说,了解周围的项目。例如,如果我只想过滤两边被奇数包围的项目,我可以这样做(我利用了一些 JavaScript 特性,甚至不想先检查索引是否存在):

const surroundedByOneOddNumber = arrayOfInfo.filter(function(item,index) {

  const itemBefore = arrayOfInfo[index - 1]
  const itemAfter = arrayOfInfo[index + 1]
  return ((itemBefore % 2 == 1) && (itemAfter % 2 == 1)) ? true : false

})

如果我想找到每边被两个奇数包围的数字,这将变得更加明显,因为这是一种有问题或效率低下的代码编写方式:

const surroundedByTwoOddNumbers = arrayOfInfo.filter(function(item,index) {

  const itemBefore = arrayOfInfo[index - 1]
  const itemTwoBefore = arrayOfInfo[index - 2]
  const itemAfter = arrayOfInfo[index + 1]
  const itemTwoAfter = arrayOfInfo[index + 2]
  return ((itemBefore % 2 == 1) && (itemTwoBefore % 2 == 1) && (itemAfter % 2 == 1) && (itemTwoAfter % 2 == 1)) ? true : false

})

显然,如果我想做一些事情,比如只找到每边 50 个奇数包围的数字,那么编写这样的代码将毫无意义。

有没有用函数式编程解决这个问题的好方法,或者在这种情况下最好降到 for/while 循环样式?

CodePen 与示例一起玩:https ://codepen.io/jnpdx/pen/MvradM

网名

函数式编程的整个思想是编写没有副作用的纯函数

Array.filter是函数式的,因为它返回一个新数组,而不改变原始数组。您可以在同一个数组上运行该方法数百万次而无需更改它。

如果您的逻辑变得复杂,代码也变得复杂,则没有功能魔法可以解决您的领域问题。

但是,您可以创建一个createFilter函数,它会根据您的域要求创建过滤器函数,例如:

const createFilter = ({
  before = e => true,
  after = e => true
}) => (entry, idx, entries) => 

before(entries[idx - 1]) && after(entries[idx + 1]) }; }

// This will return [ 4, 4 ] I guess ;)
[1, 3, 3, 3, 2, 4, 5, 2, 4, 7].filter(createFilter({
   before: (e) => e % 2 === 0,
   after: (e) => e % 2 === 1,
}))

以同样的方式,您只能获得前项为 50 和 100 后的值:

[50, 1, 100, 4, 50, 3, 100].filter(createFilter({
  before: (e) => e === 50,
  after: (e) => e === 100
})) // pretty sure the output is [1, 3] 

所以这样你就有了一个可重用的filterCreator,将它扩展到你的需要;)

更新

@Aadit M Shah 是的,在再次阅读 OP 后,我得出的结论是,我的方法仍然有效,您只需要编写自己的filterCreator函数即可。Array.filter实际上并没有什么问题

const filterBySurrounding = (n, meetCondition) => {
  return (item, idx, array) => {
    return n <= idx && idx + n <= array.length - 1
      ? array.slice(idx - n, idx).every(meetCondition) &&
        array.slice(idx + 1, idx + 1 + n).every(meetCondition)
      : false

  }
}

const isOdd = n => n % 2 === 1
array.filter(filterBySurrounding(50, isOdd))

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

传递上下文函数的干净方法是什么?

来自分类Dev

AS3:匿名函数中“ this”的上下文是什么?

来自分类Dev

nodejs文件中的函数的上下文是什么?

来自分类Dev

在RPM .spec中设置SELinux上下文的正确方法是什么?

来自分类Dev

在module.exports中调用函数的上下文安全方法是什么?

来自分类Dev

Django中的上下文是什么?

来自分类Dev

在Clean Architecture中为Autofac实现Serilog上下文记录器注入的正确方法是什么?

来自分类Dev

使用DataGridView时更改上下文的正确方法是什么?

来自分类Dev

使用DataGridView时更改上下文的正确方法是什么?

来自分类Dev

emacs中的defadvice,使用它的正确上下文是什么

来自分类Dev

在RESTful API的上下文中,您必须对其应用过滤器的UPDATE / DELETE资源的正确方法是什么

来自分类Dev

'=>' 是什么意思(在函数/属性上下文中)?

来自分类Dev

在Julia中的函数声明的上下文中,“ where {t:<Integer}”是什么意思?

来自分类Dev

在Hibernate的load()方法上下文中,代理是什么?

来自分类Dev

关闭Spring Application上下文的最佳方法是什么?

来自分类Dev

在覆盖的函数中获取正确的此上下文

来自分类Dev

Dagger:定义在其构造函数中包含上下文的可注入类的正确方法

来自分类Dev

传递到BroadcastReceiver的onReceive()中的上下文是什么?

来自分类Dev

CDI中的上下文是什么意思?

来自分类Dev

PHP中的流上下文-这是什么?

来自分类Dev

web.xml中的上下文参数是什么?

来自分类Dev

xv6中的上下文是什么?

来自分类Dev

这段代码中“上下文”的类型是什么?

来自分类Dev

Facebook api调用中/ me的上下文是什么?

来自分类Dev

EF Core 上下文类中的模型是什么?

来自分类Dev

将状态上下文作为附加方法参数嵌入状态中的利弊是什么?

来自分类Dev

在OpenSSL中释放/分配上下文的正确方法

来自分类Dev

Golang模板:上下文是什么?

来自分类Dev

程序的执行上下文是什么?

Related 相关文章

  1. 1

    传递上下文函数的干净方法是什么?

  2. 2

    AS3:匿名函数中“ this”的上下文是什么?

  3. 3

    nodejs文件中的函数的上下文是什么?

  4. 4

    在RPM .spec中设置SELinux上下文的正确方法是什么?

  5. 5

    在module.exports中调用函数的上下文安全方法是什么?

  6. 6

    Django中的上下文是什么?

  7. 7

    在Clean Architecture中为Autofac实现Serilog上下文记录器注入的正确方法是什么?

  8. 8

    使用DataGridView时更改上下文的正确方法是什么?

  9. 9

    使用DataGridView时更改上下文的正确方法是什么?

  10. 10

    emacs中的defadvice,使用它的正确上下文是什么

  11. 11

    在RESTful API的上下文中,您必须对其应用过滤器的UPDATE / DELETE资源的正确方法是什么

  12. 12

    '=>' 是什么意思(在函数/属性上下文中)?

  13. 13

    在Julia中的函数声明的上下文中,“ where {t:<Integer}”是什么意思?

  14. 14

    在Hibernate的load()方法上下文中,代理是什么?

  15. 15

    关闭Spring Application上下文的最佳方法是什么?

  16. 16

    在覆盖的函数中获取正确的此上下文

  17. 17

    Dagger:定义在其构造函数中包含上下文的可注入类的正确方法

  18. 18

    传递到BroadcastReceiver的onReceive()中的上下文是什么?

  19. 19

    CDI中的上下文是什么意思?

  20. 20

    PHP中的流上下文-这是什么?

  21. 21

    web.xml中的上下文参数是什么?

  22. 22

    xv6中的上下文是什么?

  23. 23

    这段代码中“上下文”的类型是什么?

  24. 24

    Facebook api调用中/ me的上下文是什么?

  25. 25

    EF Core 上下文类中的模型是什么?

  26. 26

    将状态上下文作为附加方法参数嵌入状态中的利弊是什么?

  27. 27

    在OpenSSL中释放/分配上下文的正确方法

  28. 28

    Golang模板:上下文是什么?

  29. 29

    程序的执行上下文是什么?

热门标签

归档