-

   rss_rss_hh_new

 - e-mail

 

 -

 LiveInternet.ru:
: 17.03.2011
:
:
: 51

:


[ ] JavaScript: break

, 02 2017 . 14:44 +

! Rethinking JavaScript: Replace break by going functional.


image


Rethinking JavaScript: Death of the For Loop ( : JavaScript: for) for . " break?".


break GOTO


break , - GOTO.


, " , , . break GOTO?"



//  .  !
outer:
    for (var i in outerList) {
inner: 
        for (var j in innerList) {
            break outer;
        }
    }

(. labels) . GOTO. JavaScript'e break continue, GOTO.


JavaScript' , break continue GOTO


image


" break , ?"


?


, . GOTO . "use strict", .


" . "


.


Why Programmers Need Limits


break?


. break. . . .


, , , Lodash, Ramda, lazy.js, .


, isKitten:


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

for. , .


var firstKitten
for (var i = 0; i < cats.length; i++) {
  if (isKitten(cats[i])) {
    firstKitten = cats[i]
    break
  }
}

lodash


const firstKitten = _.find(cats, isKitten)

, - -. 5 .


var first5Kittens = []
//   for
for (var i = 0; i < cats.length; i++) {
  if (isKitten(cats[i])) {
    first5Kittens.push(cats[i])
    if (first5Kittens.length >= 5) {
      break
    }
  }
}


. : , , .


JavaScript.


  const result = cats.filter(isKitten)
    .slice(0, 5);

. Lodash'.


  const result = _.take(_.filter(cats, isKitten), 5)

.


Lodash , - . lazy.js. " underscore, ". .


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

, ( lazy.js) (filter, map ) .



, - !


, (. generic) , filter, ?


.


const get5Kittens = () => {
  const newList = []

  //   for
  for (var i = 0; i < cats.length; i++) {
    if (isKitten(cats[i])) {
      newList.push(cats[i])

      if (newList.length >= 5) {
        break
      }
    }
  }

  return newList
}

. 5 limit, isKitten predicate cats list .


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
}

takeFirst, !


takeFirst . . .


for, . i newList .


const takeFirst = (limit, predicate, list, i = 0, newList = []) => {
   // ...
}

(isDone) limit 0 (limit ) list.


, predicate. predicate , takeFirst, limit newList.
.


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)
  }
}

if Rethinking Javascript: the If Statement.


/*
 * takeFirst   `filter`,   .
 *
 * @param {number} limit -    
 * @param {function} predicate -  ,  item   true  false
 * @param {array} list - ,   
 * @param {number} [i] - ,     (  0)
 */
const takeFirst = (limit, predicate, list, i = 0, newList = []) => {
    const isDone = limit <= 0 || i >= list.length
    const isMatch = isDone ? undefined : predicate(list[i])

    return isDone  ? newList :
           isMatch ? takeFirst(limit - 1, predicate, list, i + 1, [...newList, list[i]])
                   : takeFirst(limit, predicate, list, i + 1, newList)
}

:


const first5Kittens = takeFirst(5, isKitten, cats)

takeFirst (. currying) . ( )


const first5 = takeFirst(5)
const getFirst5Kittens = first5(isKitten)
const first5Kittens = getFirst5Kittens(cats)


( lodash, ramda, lazy.js), , !


, takeFirst , , . JavaScript Maximum call stack size exceeded.


JavaScript .


, - @joelnet. , .



-> Functional JavaScript: Functional Composition For Every Day Use.
-> Rethinking JavaScript: Death of the For Loop
( : JavaScript: for)
-> Rethinking JavaScript: Elliminate the switch statement for better code
-> Functional JavaScript: Resolving Promises Sequentially


. : , , .

Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330082/

:  

: [1] []
 

:
: 

: ( )

:

  URL