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

  • 相关阅读:
    IE11和传统asp.net的兼容问题
    时区和夏令时
    GTA项目 三, 使用 bootstrap table展示界面,使得data和UI分离
    GTA项目 二, JSON接口开放跨域访问
    GTA项目 一, 包装外部WebService
    DNS域名解析
    CRM 迁移服务器备忘
    CentOS6.5 安装HAProxy 1.5.20
    Custom IFormatProvider
    数据分区考虑
  • 原文地址:https://www.cnblogs.com/samwu/p/9593818.html
Copyright © 2011-2022 走看看