πŸ“•[μ±…] 쏙쏙 λ“€μ–΄μ˜€λŠ” ν•¨μˆ˜ν˜• μ½”λ”© - 29,30

rivolt0421Β·2023λ…„ 4μ›” 23일
0

πŸ“•μ±…

λͺ©λ‘ 보기
17/26

327p ~ 346p

μš”μ•½

πŸ˜‡ 슀트림 κ²°ν•© (stream fusion)

  • map(), filter(), reduce() 체인을 μ΅œμ ν™” ν•˜λŠ” 것.

  • μ΅œμ ν™”μΌ 뿐이고 병λͺ©μ΄ λ°œμƒν–ˆμ„ λ•Œλ§Œ μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€.
    λŒ€λΆ€λΆ„μ˜ 경우 μ—¬λŸ¬ 단계λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 더 λͺ…ν™•ν•˜κ³  읽기 쉽닀.

    • map
    /// Two map() steps in a row
    
    var names = map(customers, getFullName);
    var nameLengths = map(names, stringLength);
    
    /// Equivalent as a single map() step
    
    var nameLengths = map(customers, function(customer) {
      return stringLength(getFullName(customer));
    });
    • filter
    /// Two filter() steps in a row
    
    var goodCustomers = filter(customers, isGoodCustomer);
    var withAddresses = filter(goodCustomers, hasAddress);
    
    /// Equivalent as a single filter() step
    
    var withAddresses = filter(customers, function(customer) {
      return isGoodCustomer(customer) && hasAddress(customer);
    });
    • reduce
    /// map() step followed by reduce() step
    
    var purchaseTotals = map(purchases, getPurchaseTotal);
    var purchaseSum = reduce(purchaseTotals, 0, plus);
    
    /// Equivalent as a single reduce() step
    
    var purchaseSum = reduce(purchases, 0, function(total, purchase) {
      return total + getPurchaseTotal(purchase);
    });

πŸ˜‡ λ°˜λ³΅λ¬Έμ„ ν•¨μˆ˜ν˜• λ„κ΅¬λ‘œ λ¦¬νŒ©ν„°λ§ ν•˜κΈ°

λ¦¬νŒ©ν„°λ§ ν•  μ½”λ“œ.
λ°°μ—΄ νŠΉμ • λΆ€λΆ„μ˜ μ—°μ†λœ 데이터인 window의 평균을 κ΅¬ν•˜κ³ , 결과에 μΆ”κ°€ν•œλ‹€.
이λ₯Ό λ°°μ—΄μ˜ μ‹œμž‘λΆ€ν„° λκΉŒμ§€ 반볡.

var answer = [];
var window = 5;
for(var i = 0; i < array.length; i++) {
  var sum = 0;
  var count = 0;
  for(var w = 0; w < window; w++) {		// 1
    var idx = i + w;					// 2
    if(idx < array.length) {
      sum += array[idx];				// 3
      count += 1;
    }
  }
  answer.push(sum/count);
}

Tip 1. 데이터λ₯Ό 배열에 λ‹΄κΈ°

  • 주석 1, 2, 3 을 보면, 값이 계속 λ°”λ€Œμ§€λ§Œ λ°°μ—΄λ‘œ λ§Œλ“€μ§€λŠ” μ•Šκ³  μžˆλ‹€.

  • 데이터λ₯Ό 배열에 λ„£μœΌλ©΄ ν•¨μˆ˜ν˜• 도ꡬλ₯Ό μ“Έ 수 μžˆλ‹€.

  • μ½”λ“œλ₯Ό 보면 λ°˜λ³΅λ¬Έμ„ ν†΅ν•΄μ„œ windowλΌλŠ” λ²”μœ„λ₯Ό μΆ”μƒμ μœΌλ‘œ μ‚¬μš©ν•˜λŠ”λ°, 이λ₯Ό λͺ…μ‹œμ μΈ λ°°μ—΄λ‘œ μΆ”μΆœν•˜λ©΄ ν•¨μˆ˜ν˜• 도ꡬλ₯Ό μ“Έ 수 μžˆκ²Œλœλ‹€.

    /// make subarray
    var answer = [];
    var window = 5;
    
    for(var i = 0; i < array.length; i++) {
      var sum = 0;
      var count = 0;
      var subarray = array.slice(i, i + window);  //here
      for(var w = 0; w < subarray.length; w++) {
        sum += subarray[w];
        count += 1;
      }
      answer.push(sum/count);
    }

Tip 2. ν•œ λ²ˆμ— 전체 배열을 μ‘°μž‘ν•˜κΈ°

  • μœ„μ—μ„œ 데이터λ₯Ό λ°°μ—΄λ‘œ λ§Œλ“  것을, ν•¨μˆ˜ν˜• 도ꡬλ₯Ό μ΄μš©ν•΄ 'ν•œ λ²ˆμ—' μ‘°μž‘ν•œλ‹€.

    /// Using average
    var answer = [];
    var window = 5;
    
    for(var i = 0; i < array.length; i++) {
      var subarray = array.slice(i, i + window);
      answer.push(average(subarray));
    }
  • κ°€μž₯ μƒμœ„μ˜ forλ¬Έ μ—μ„œλ„, i값이 계속 λ°”λ€Œλ©΄μ„œ μ‚¬μš©λ˜κ³  μžˆμ§€λ§Œ, λ°°μ—΄λ‘œ λ§Œλ“€μ–΄μ§€μ§€λŠ” μ•Šκ³  μžˆλ‹€.

  • 이 λ˜ν•œ 1) 데이터λ₯Ό 배열에 λ„£κ³ , 2) ν•œ λ²ˆμ— μ‘°μž‘ν•˜λ„λ‘ κ°œμ„ ν•œλ‹€.

    // make range (set of indices)
    function range(start, end) {
      var ret = [];
      for(var i = start; i < end; i++)
        ret.push(i);
      return ret;
    }
    var indices = range(0, array.length);
    var window = 5;
    
    var answer = map(indices, function(i) {
      var subarray = array.slice(i, i + window);
      return average(subarray);
    });

Tip 3. μž‘μ€ λ‹¨κ³„λ‘œ λ‚˜λˆ„κΈ°

  • ν˜„μž¬ map()에 λ„˜κΈ°λŠ” μ½œλ°±μ—μ„œ 두 κ°€μ§€μ˜ 일을 ν•˜κ³  μžˆλ‹€.

    • ν•˜μœ„ λ°°μ—΄ λ§Œλ“€κΈ°
    • 평균을 κ³„μ‚°ν•˜κΈ°
  • 이λ₯Ό μž‘μ€ λ‹¨κ³„λ‘œ λ‚˜λˆ„μ–΄ μž‘μ—…μ΄ 더 λͺ…ν™•ν•˜κ²Œ 보이도둝 ν•œλ‹€.

    /// in two steps
    var indices = range(0, array.length);
    var window = 5;
    
    var windows = map(indices, function(i) {	// make subset
      return array.slice(i, i + window);
    });
    
    var answer = map(windows, average);		// calculate average

πŸ˜‡ κ²°κ³Ό

  • μ²˜μŒμ—λŠ” 반볡문이 μ€‘μ²©λ˜κ³ , 인덱슀λ₯Ό κ³„μ‚°ν•˜λ©°, μ§€μ—­λ³€μˆ˜λ₯Ό λ°”κΎΈλŠ” μ½”λ“œ.
  • 이 과정을 각 λ‹¨κ³„λ‘œ λ‚˜λˆ  λͺ…ν™•ν•˜κ²Œ λ§Œλ“€μ—ˆμŒ. κΈ€λ‘œλ„ κ·ΈλŒ€λ‘œ λ°”κΏ” μ“Έ 수 μžˆλ‹€.

배열을 μ΄λ™ν•˜λ©° 평균 κ΅¬ν•˜κΈ°
1. 숫자 λ¦¬μŠ€νŠΈκ°€ μžˆμ„ λ•Œ 각 μˆ«μžμ— λŒ€ν•œ windowλ₯Ό λ§Œλ“­λ‹ˆλ‹€.
2. 그리고 각 window의 평균을 κ΅¬ν•©λ‹ˆλ‹€.

πŸ˜‡ 체이닝 팁 μš”μ•½

  • ν•¨μˆ˜ν˜• λ„κ΅¬λŠ” λ°°μ—΄ 전체λ₯Ό λ‹€λ£° λ•Œ 잘 λ™μž‘ν•œλ‹€.
  • λ°°μ—΄ 일뢀에 λŒ€ν•΄ λ™μž‘ν•˜λŠ” 반볡문이 μžˆλ‹€λ©΄, λ°°μ—΄ 일뢀λ₯Ό μƒˆλ‘œμš΄ λ°°μ—΄λ‘œ λ‚˜λˆŒ 수 μžˆλ‹€.
  • map(), filter(), reduce()λŠ” ν•¨μˆ˜ν˜• λ„κ΅¬μ˜ μ „λΆ€κ°€ μ•„λ‹ˆλ‹€. ν•¨μˆ˜λ₯Ό μΆ”μΆœν•˜κ³  쒋은 이름을 λΆ™μ—¬ μ‚¬μš©ν•˜μž!

발췌

체이닝 디버깅을 μœ„ν•œ 팁

  1. λ³€μˆ˜λͺ… 잘 μ§“κΈ°.
    각 λ‹¨κ³„μ—μ„œ μ–΄λ–€ 것을 ν•˜κ³  μžˆλŠ”μ§€ μ•ŒκΈ° μ‰½κ²Œ 이름을 잘 μ§€μ–΄μ•Ό ν•œλ‹€.
  1. 좜λ ₯해보기.
    졜고의 κ·Όλ³Έ 디버그 printλ¬Έ. 각 단계λ₯Ό 좜λ ₯ν•΄ λ³΄λ©΄μ„œ 확인.
  1. νƒ€μž…μ„ 따라가 보기.
    μžλ°”μŠ€ν¬λ¦½νŠΈμ²˜λŸΌ νƒ€μž…μ΄ μ—†λŠ” μ–Έμ–΄λ₯Ό μ‚¬μš©ν•΄λ„ ν•¨μˆ˜ν˜• λ„κ΅¬λŠ” νƒ€μž…μ΄ μžˆλ‹€. λ‹€λ§Œ 컴파일 νƒ€μž„μ— κ²€μ‚¬ν•˜μ§€ μ•Šμ„ 뿐.

    • map()이 λ¦¬ν„΄ν•˜λŠ” μƒˆλ‘œμš΄ λ°°μ—΄μ—λŠ”, 콜백이 λ¦¬ν„΄ν•˜λŠ” νƒ€μž…μ˜ κ°’.
    • reduce()의 κ²°κ³Όκ°’μ˜ νƒ€μž…μ€, μ΄ˆκΈ°κ°’μ˜ νƒ€μž… 그리고 콜백이 λ¦¬ν„΄ν•˜λŠ” κ°’μ˜ νƒ€μž…κ³Ό κ°™λ‹€.

λ©”λͺ¨

λ¦¬νŒ©ν† λ§ 된 λͺ¨μŠ΅μ„ λ³΄λ‹ˆ κΉ”λ”ν•˜κΈ΄ ν•˜λ„€...

profile
I think I think too much.

0개의 λŒ“κΈ€