【发布时间】:2017-08-19 02:11:33
【问题描述】:
在函数式编程中,基于单个项目的特征进行过滤相对简单——例如,过滤以仅查找奇数:
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
【问题讨论】:
-
我的第一个直觉是创建一个循环,也许递归会是一个有吸引力的解决方案。
-
你不会写出所有这些条件。您只需
slice数组并测试该切片的every元素上的条件。
标签: javascript functional-programming