zoukankan      html  css  js  c++  java
  • JavaScript形而上的For循环中的Break

    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

  • 相关阅读:
    Linux下的目录结构
    VM
    代码命名规范
    java环境及配置
    Code::Blocks 使用Cygwin编译加调试
    vscode使用体会
    openwrt编译笔记
    ubuntu20 使用root登录
    程序员如何更好的表达自己的想法- Graphviz:关系图脚本绘制工具-转
    编译codelite心得
  • 原文地址:https://www.cnblogs.com/samwu/p/9593818.html
Copyright © 2011-2022 走看看