π Lodash μ§μ° νκ°(Lazy Evaluation) μ리
μ§μ° νκ°λ?
μ»΄ν¨ν° νλ‘κ·Έλλ°μμ μ§μ° νκ°(Lazy Evaluation)λ ν¨μν νλ‘κ·Έλλ°μμ μμ£Ό μ¬μ©λλ κ°λ μ΄λ€.
μ§μ° νκ°λ λ¨μ΄ κ·Έλλ‘ κ³μ°μ΄ νμν μμ κΉμ§ κ³μ°μ 미루λ κ²μ μλ―Ένλ€. μ¦, μ§μ° νκ°λ κ°μ κ³μ°νλ μμ μ λ¦μΆμ΄μ λΆνμν κ³μ°μ λ°©μ§νκ³ μμ€ν μ μ±λ₯μ ν₯μμν¬ μ μκ² λλ€. μ΄λ₯Ό ν΅ν΄, λ©λͺ¨λ¦¬ μ¬μ©λμ΄ κ°μνκ³ νλ‘κ·Έλ¨μ λ°μμ±μ΄ ν₯μλλ€.
μ§μ° νκ° λμ μ리 #1
μ§μ° νκ°(Lazy Evaluation)μ μ격ν νκ°(strict evaluation)μ λμ λ°©μκ³Ό λΉκ΅λ₯Ό ν΅ν΄ μ§μ° νκ°μ λμ λ°©μμ μμ보μ.
βλ€μ μ½λμ κ°μ΄, 0~5λ‘ μ΄λ£¨μ΄μ§ λ°°μ΄μμ κ° μμμ λν΄ 10μ κ³±ν λ€ νμλ§ κ³ λ₯΄κ³ μ«μλ₯Ό λ¬Έμλ‘ λ°κΎΈκ³ 첫2κ°λ§ μΆμΆνλ λ‘μ§μ μλ°μ€ν¬λ¦½νΈ ES6μ Lodash μμ μ΄λ€μμΌλ‘ νκ°κ° λλμ§ μμ보μ.
const arr = [0, 1, 2, 3, 4, 5]
const result = arr
.map(num => num + 10)
.filter(num => num % 2)
.slice(0, 2)
console.log(result)
ES6 μ격ν νκ°
μ격ν νκ°λ μ§μ° νκ°μ λ°λλ§λ‘, μ°λ¦¬κ° μΌλ°μ μΌλ‘ μκ°νλ νκ° λ°©μμ΄λ€. μ격ν νκ°λ νκ° νλ¦μ΄ μΌμͺ½μμ μ€λ₯Έμͺ½μΌλ‘ νλ₯Έλ€.
const arr = [0, 1, 2, 3, 4, 5]
const result = arr
.map(num => num + 10) // 1. λͺ¨λ λ°°μ΄μμμ λν΄ 10μ λνλ€ → [0, 11, 12, 13, 14, 15]
.filter(num => num % 2) // 2. λͺ¨λ λ°°μ΄μμμ λν΄ νμλ§ κ΅¬νλ€ → [11, 13, 15]
.slice(0, 2) // 3. λͺ¨λ λ°°μ΄μμμ λν΄ 2κ°λ§ μΆμΆνλ€ → [11, 13]
console.log(result) // [11, 13]
μ μ€ν νλ¦μ 보면 map, filter, slice κ³ μ°¨ν¨μλ€μ΄ κ°κ°μ κ³μ°μ΄ λͺ¨λ μ’ λ£λμ΄μΌ λ€μ λ¨κ³λ₯Ό μννλ κ²μ λ³Ό μ μλ€. κ·Έλμ μ΄ κ³μ° νμλ₯Ό ꡬνμλ©΄ map 6λ² + filter 6λ² + slice 2λ²μΌλ‘ μ΄ 14λ²μ΄ λλ€.
μ½λ μμΌλ‘λ λ¬Έμ λ μμ§λ§ μκ°μ νκΈ°ν΄λ³΄μ.
μ΅μ’ κ²°κ³Όλ¬ΌμΈ 11κ³Ό 13μ μ»κΈ° μν΄μ mapμ ν΅ν΄ λͺ¨λ λ°°μ΄ μμμ λ§μ μ νκ³ , νμλ₯Ό ꡬνκΈ° μν΄ λͺ¨λ λ°°μ΄ μμμ νν°λ§μνμλ€. νμ§λ§ μμ κ·Έλ¦Όμ 보면 11κ³Ό 13μ μ»κΈ° μν΄ λ°°μ΄ μμ 0 ~ 3 κΉμ§λ νκ° λμΌ ν ν μ§λ§ κ·Έ λ€μ 4μ 5λ λ Όλ¦¬μ μΌλ‘ νκ°ν νμκ° μμ΄ λ³΄μΈλ€. μ¦, μΈλ°μλ μ°μ°μ΄ λ€μ΄κ° κ²κ³Ό κ°λ€.
Lodash μ§μ° νκ°
λ€μμ μμ μμ λ₯Ό Lodash ν¨μλ₯Ό μ΄μ©ν μ§μ° νκ°λ₯Ό νμ©ν΄ μμ λ₯Ό μνν μ½λμ΄λ€.
Loadash λΌμ΄λΈλ¬λ¦¬μμλ _.chain , _.value ν¨μλ₯Ό μ΄μ©ν΄ μ§μ° νκ°λ₯Ό ꡬνν μ μλ€. chain ν¨μμ μΈμλ‘ μ¬μ©ν λ°μ΄ν°λ₯Ό λκΈ°λ©΄ ν΄λΉ λ°μ΄ν°λ₯Ό lodash κ°μ²΄λ‘ κ°μΌλ€. μ΄ν μ 곡λλ μ§μ° νκ° ν¨μλ€μ μ΄μ©ν΄ μνλ κ²°κ³Όλ‘ κ°κ³΅νλ€. λ§μ§λ§μΌλ‘ value ν¨μλ₯Ό ν΅ν΄ wrapping λμ΄ μλ κ²°κ³Όλ₯Ό μ€μ κ°μΌλ‘ μΉννλ€.
const arr = [0, 1, 2, 3, 4, 5]
const result = _.chain(arr) // μΌλ°λ°°μ΄μ lodash μ²΄μΈ κ°μ²΄λ‘ λ³ννλ€.
.map(num => num + 10)
.filter(num => num % 2)
.take(2)
.value() // μ§μ° νκ°λ κ²°κ³Όκ° νκ°λμ΄ μ€μ κ°μΌλ‘ λ³ν
console.log(result) // [11, 13]
μ κ·Έλ¦Όμμ λ³Ό μ μλ―μ΄ μ§μ° νκ°λ νκ° νλ¦μ μμμ μλλ‘ νλ₯Έλ€. μ΄λ¬ν νλ¦μ μ₯μ μ λ°°μ΄ μμ 3 κΉμ§ νκ°κ° μλ£λμμ λ μ΄λ―Έ μνλ κ²°κ³Όκ° λμκΈ° λλ¬Έμ, 4μ 5μ λν κ³μ°μ νμ§ μλκ±Έ λ³Ό μ μλ€. λ°λΌμ μ΄ κ³μ° νμλ₯Ό ꡬνμλ©΄ map 4λ² + filter 4λ² + slice 2λ²μΌλ‘ μ΄ 10λ²μ΄ λλ€.
μ 리νμλ©΄ μ§μ° νκ°λ₯Ό μ¬μ©νλ©΄ νμν κ³μ°λ§ μννλ―λ‘, μ±λ₯ ν₯μμλ λμμ΄ λκ² λλ€.
μ§μ° νκ° λμ μ리 #2
μ΄λ²μ μ’λ μκ°μ μΌλ‘ μ λλ©μ΄μ μ ν΅ν΄ μ§μ° νκ°μ μ±λ₯ ν₯μ μ리μ λν΄ μ΄ν΄λ³΄μ
ES6 μ격ν νκ°
μλ μ λλ©μ΄μ μ 보면 λ¨Όμ λͺ¨λ λ°°μ΄ μμμ λν΄ 10λ³΄λ€ μμ μ«μλ§ λ°λ‘ μμ λ°°μ΄μ νκΊΌλ²μ λͺ¨μλκ³ μμ 3κ°λ§ κ°μ Έκ°λ κ²μ λ³Ό μ μλ€. μ¦, filterλ₯Ό λͺ¨λ μννκ³ λ§μ§λ§μΌλ‘ sliceλ₯Ό μννλ€.
const arr = [4, 15, 20, 7, 3, 13, 2, 20]
const result = arr
.filter(num => num < 10) // 1. 10λ³΄λ€ μμ μ«μλ§ νν°λ§ → [4, 7, 3, 2]
.slice(0, 3) // 2. 3κ°λ§ κ³ λ¦ → [4, 7, 3]
console.log(result); // [4, 7, 3]
Lodash μ§μ° νκ°
μ§μ° νκ°κ° μ μ©λ μ λλ©μ΄μ μ 보면 λ°°μ΄ μμλ§λ€ κ°κ° filterλ₯Ό νλ² μννκ³ sliceλ₯Ό μννκ³ λ€μ μμλ‘ λμ΄κ°λ μμΌλ‘ νκ°κ° μνλ¨μ λ³Ό μ μλ€. κ·Έλ¦¬κ³ λ¨μ 13, 2, 20 μμμ λν΄μ νκ° μ°μ°μ μ μ©νμ§ μμ ν¨μ¬ λ λΉ λ₯΄κ² κ²°κ³Όκ°μ μ»κ² λλ€.
const arr = [4, 15, 20, 7, 3, 13, 2, 20];
const result = _.chain(arr)
.filter(num => num < 10) // μ§μ° νκ°λ₯Ό μμν©λλ€.
.take(3)
.value(); // νκ°λ₯Ό μνν©λλ€.
console.log(result); // [4, 7, 3]
μ΄μ²λΌ μ§μ° νκ°λ μ°μ° νμ μ체λ₯Ό μ€μ¬ λ³΄λ€ μ’μ μ±λ₯μ μ€λ€. κ·Έλ¦¬κ³ μ§μ° νκ°λ λμμ΄ ν¬λ©΄ ν΄μλ‘ κ·Έ ν¨κ³Όλ₯Ό λ°ννλ€.
λ€μμ μμ μμ μ½λμμ λ°°μ΄μ μμ κ°μλ₯Ό 1,000,000κ°λ‘ μμ ν λ€ μ μ©ν μ±λ₯ λΉκ΅ κ²°κ³Όμ΄λ€. κ·Έλνμμ λ³΄λ― μ§μ° νκ°κ° μλμ μΈ μ±λ₯μ μλνλ€.
# μ°Έκ³ μλ£
https://lodash.com/docs/4.17.15#chain
https://blog.weirdx.io/post/16662
https://armadillo-dev.github.io/javascript/whit-is-lazy-evaluation/