break相当于循环中的GOTO,需避免使用。

下面是一个break使用例子。

找出第一个months小于7的项目。

const cats = [
{ name: 'Mojo', months: 84 },
{ name: 'Mao-Mao', months: 34 },
{ name: 'Waffles', months: 4 },
{ name: 'Pickles', months: 6 }
]
const isKitten = cat => cat.months < 7
var firstKitten
for (var i = 0; i < cats.length; i++) {
if (isKitten(cats[i])) {
firstKitten = cats[i]
break
}
}

类似的例子,找出前五个项目。

var first5Kittens = []
// old-school edge case kitty loop
for (var i = 0; i < cats.length; i++) {
if (isKitten(cats[i])) {
first5Kittens.push(cats[i])
if (first5Kittens.length >= 5) {
break
}
}
}

对上面的例子进行改造。

用函数封装下。用limit来代替5,predicate来代替isKitten,list来代替cats。然后把这些作为函数的参数。

const takeFirst = (limit, predicate, list) => {
const newList = [] for (var i = 0; i < list.length; i++) {
if (predicate(list[i])) {
newList.push(list[i]) if (newList.length >= limit) {
break
}
}
} return newList
}

使用递归形式来表示循环,跳出递归即break。


const takeFirst = (limit, predicate, list, i = 0, newList = []) => {
const isDone = limit <= 0 || i >= list.length
const isMatch = isDone ? undefined : predicate(list[i]) if (isDone) {
return newList
} else if (isMatch) {
return takeFirst(limit - 1, predicate, list, i + 1, [...newList, list[i]])
} else {
return takeFirst(limit, predicate, list, i + 1, newList)
}
}

使用第三方库Lazy.js来实现这个需求。

const result = Lazy(cats)
.filter(isKitten)
.take(5)

参考:

https://hackernoon.com/rethinking-javascript-break-is-the-goto-of-loops-51b27b1c85f8

最新文章

  1. Python 键盘记录
  2. php随机ip
  3. ODI 12c 安装
  4. (转)可收缩、扩展的TextView
  5. 【转载】mysql 四种隔离级别分析
  6. PHP中用mysqli面向过程打开连接关闭mysql数据库
  7. call-template和apply-templates
  8. Genymotion如何访问本地服务器?
  9. Java反射机制浅析
  10. 【linux-shell】rsync
  11. javaWEB总结(9):自定义HttpServlet
  12. MySQL 完整和增量备份与恢复
  13. COM学习(四)——COM中的数据类型
  14. 策略模式(Strategy Model)
  15. tensorflow 升级到1.9-rc0,生成静态图frozen graph.pb本地测试正常, 在其他版本(eg1.4版本)或者android下运行出错NodeDef mentions attr &#39;dilations&#39; not in Op&lt;name=Conv2D; signature=input:T, filter:T -&gt; output:T; attr=T:type,allowed=[DT_
  16. Java基础恶补——内存泄露、内存溢出
  17. shell 数值计算
  18. sudo: unable to resolve host myhostname: Connection timed out
  19. spring cloud连载第三篇之Spring Cloud Netflix
  20. C#基础笔记(第九天)

热门文章

  1. (4.11)mysql备份还原——mysql闪回技术(基于binlog)
  2. CentOS7、REHL7的firewalld防火墙使用简单说明
  3. for循环的beak continue用法
  4. 深入理解Java虚拟机8-chap12-13-斗者5星
  5. Pocket Gems面经prepare: Diamond and Ruby
  6. ArrayList 和 LinkList 的区别
  7. elasticsearch开机启动脚本
  8. python中List append()、extend()和insert()的区别
  9. vue使用v-for时vscode报错 Elements in iteration expect to have &#39;v-bind:key&#39; directives
  10. Comparing Spring AOP and AspectJ