lodash - chunk ๐Ÿ”–

Jung Hyun Kimยท2020๋…„ 12์›” 7์ผ
4

lodash

๋ชฉ๋ก ๋ณด๊ธฐ
1/5

lodash

  • A modern JavaScript utility library delivering modularity, performance, & extras

https://github.com/lodash/lodash

์ข‹์€ utilํ•จ์ˆ˜ ์งœ๋Š” ๊ฒƒ์€ ๋„ˆ๋ฌด ํž˜๋“ค๋‹ค. ๋ฌผ๋ก  ๋Œ์•„๊ฐ€๋Š” ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ.. ์ตœ์ ํ™” ๋œ ํ•จ์ˆ˜์ธ์ง€ ๊ตฌ๋ถ„ํ•˜๊ธฐ๋„ ์–ด๋ ต๊ณ .. ๋˜ ์ข‹์€ ํ•จ์ˆ˜์ธ์ง€ ๊ตฌ๋ถ„ํ•˜๊ธฐ๋„ ์•„์ง์€ ํž˜๋“ ๊ฑฐ ๊ฐ™๋‹ค ๐Ÿ˜ฐ

์ด๋•Œ ์ถ”์ฒœ๋ฐ›์€ lodash ๐Ÿค—

์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๊ฐ€๋Šฅ ํ•œ ์œ ํ‹ธ ํ•จ์ˆ˜ ์˜คํ”ˆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ฝ”๋“œ๋ฅผ ์ž˜ ์งœ๋Š” ์‚ฌ๋žŒ๋“ค์ด ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๋งŒ๋“ค์–ด ๋†“์€ ํ•จ์ˆ˜์˜ ์˜ˆ์‹œ๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค! ๋‚˜์˜ ๊ฒฝ์šฐ๋Š” ํ•˜๋‚˜ํ•˜๋‚˜ ๋œฏ์–ด๋ณด๋ฉฐ ์‚ฌ๋žŒ๋“ค์ด ์œ ํ‹ธํ•จ์ˆ˜๋ฅผ ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค์—ˆ๋Š”์ง€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฌธ๋ฒ•์„ ์ง‘์–ด๊ฐ€๋Š” ๊ณต๋ถ€๋ฅผ ํ•ด๋ณด๋ ค ํ•œ๋‹ค!

  • lodashํ•จ์ˆ˜ ์•ˆ์— ๋˜ lodashํ•จ์ˆ˜๋ฅผ import ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ฝ”๋“œ๊ฐ€ ์งœ์—ฌ์ ธ ์žˆ์–ด์„œ ์ฐจ๊ทผ์ฐจ๊ทผ ์ ์–ด๋ณผ๊นŒ ํ•œ๋‹ค.

1.chunk

  • 2๊ฐœ์˜ ์ธ์ž(๋ฐฐ์—ด๊ณผ ์ˆซ์ž) ๋ฅผ ๋ฐ›๋Š” ํ•จ์ˆ˜์ด๊ณ , ์ˆซ์ž ๊ธธ์ด ๋งŒํผ ๋ฐฐ์—ด์„ ์ž๋ฅด๊ณ , ๋‚˜๋จธ์ง€๊ฐ€ ์žˆ๋‹ค๋ฉด ํ•œ๋ฐฐ์—ด์— ๋ฌถ์–ด์„œ ๋ณด์—ฌ์ค€๋‹ค.
    ์•„๋ž˜ ์ฃผ์„์—๋„ ์ž์„ธํžˆ ๋‚˜์™€์žˆ์ง€๋งŒ ์ฆ‰
chunk(['a', 'b', 'c', 'd'], 2) // ์ด๋ ‡๊ฒŒ ํ˜ธ์ถœํ•˜๋ฉด 
=> [['a', 'b'], ['c', 'd']] // ์š”๋ ‡๊ฒŒ ๊ฐ๊ฐ ๋‘๊ฐœ์”ฉ ๋ฌถ์€ ๋ฐฐ์—ด์„ ๋ณด์—ฌ์ค€๋‹ค. 

chunk(['a', 'b', 'c', 'd'], 3) // ์ด๋ ‡๊ฒŒ ํ˜ธ์ถœํ•˜๋ฉด 
=> [['a', 'b', 'c'], ['d']] // 3๊ฐœ๊นŒ์ง€ ํ•œ๋ฐฐ์—ด์— ๋ฌถ๊ณ  ๋‚˜๋จธ์ง€๋Š” ํ•œ ๋ฐฐ์—ด์— ๋„ฃ์–ด์„œ ๋ณด์—ฌ์ค€๋‹ค. 

์ „์ฒด์ฝ”๋“œ๐Ÿ’œ

import slice from './slice.js'
import toInteger from './toInteger.js'

function chunk(array, size = 1) {
  size = Math.max(toInteger(size), 0)
  const length = array == null ? 0 : array.length
  if (!length || size < 1) {
    return []
  }
  let index = 0
  let resIndex = 0
  const result = new Array(Math.ceil(length / size))

  while (index < length) {
    result[resIndex++] = slice(array, index, (index += size))
  }
  return result
}

export default chunk

์ฝ”๋“œ ๋œฏ์–ด๋ณด๊ธฐ ๐Ÿ’œ

  • chunk ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์•„๋ž˜์™€ ๊ฐ™์ด importํ•ด์ค€๋‹ค. slice์™€ toInteger๋Š” ์ด๋ฆ„์—์„œ ์•Œ ์ˆ˜ ์žˆ ๋“ฏ ๊ฐ๊ฐ sliceํ•˜๋Š” ํ•จ์ˆ˜, ์ •์ˆ˜๋กœ ๋งŒ๋“œ๋Š” ํ•จ์ˆ˜ ๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค

import slice from './slice.js'
import toInteger from './toInteger.js'
  • ํ•จ์ˆ˜์— ์ž์„ธํžˆ ์„ค๋ช…๋œ ์ฃผ์„(์‹ค์ œ ํ”„๋กœ์ ํŠธ์—๋„ @params๋กœ ๋„˜๊ธฐ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ ์ •๋ณด๋ฅผ ์ž์„ธํžˆ ์ ์–ด๋‘๋Š”๊ฒƒ์ด ํ˜‘์—…์‹œ ์„œ๋กœ์˜ ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๋Š”๋ฐ ํฐ ๋„์›€์ด ๋œ๋‹ค! ๐Ÿค—
/**
 * Creates an array of elements split into groups the length of `size`.
 * If `array` can't be split evenly, the final chunk will be the remaining
 * elements.
 *
 * @since 3.0.0
 * @category Array
 * @param {Array} array The array to process. <- ์ฒซ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ 
 * @param {number} [size=1] The length of each chunk <- ๋‘๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ 
 * @returns {Array} Returns the new array of chunks. <- ๋ฆฌํ„ด ๊ฐ’
*/
  • ๋“œ๋””์–ด chunk ํ•จ์ˆ˜ ๋“ค์—ฌ๋‹ค ๋ณด๊ธฐ๐Ÿค“

// defaualt parameter๋กœ ๋‘๋ฒˆ์งธ ์ธ์ž๋ฅผ 1๋กœ ๋ฐ›๊ณ  ์žˆ๋‹ค ์ฆ‰ ์ธ์ž๋ฅผ ํ•˜๋‚˜๋งŒ ๋„˜๊ธธ๋•Œ๋Š” ์ž๋™์œผ๋กœ ํ•˜๋‚˜๋กœ ์ง€์ •๋˜์–ด ์žˆ๋‹ค๋Š” ๋œป 
function chunk(array, size = 1) {
  
// ๋ฐ›์€ ์ˆซ์ž๊ฐ€ ์ •์ˆ˜๊ฐ€ ์•„๋‹๊ฒฝ์šฐ, toInteger() ์— ๋„ฃ์–ด ์ •์ˆ˜๋กœ ๋งŒ๋“ค๊ณ  ์Œ์˜ ์ •์ˆ˜์ผ ๊ฒฝ์šฐ , 0์„ ๋„˜๊ฒจ์ฃผ์–ด ๋‚˜๋ˆ„์ง€ ์•Š๊ฑฐ๋‚˜, 0๋ณด๋‹ค ํฐ์ˆ˜๋กœ ๋‚˜๋ˆ„์–ด ์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. 
  size = Math.max(toInteger(size), 0)
  
// array์˜ length๋ฅผ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜์ด๊ณ , array๊ฐ€ ๋น„์–ด์„œ ์ž…๋ ฅ๋˜์–ด null ๊ฐ’์ด ๋“ค์–ด์˜ค๋ฉด length๋Š” 0, ์•„๋‹ˆ๋ฉด array.length๋ฅผ ํ†ตํ•ด ๊ตฌํ•ด์ค€๋‹ค.
  const length = array == null ? 0 : array.length

// length ๋กœ 0 ์ด ๋“ค์–ด์™€์„œ false์ด๊ฑฐ๋‚˜, size ์— ์Œ์ˆ˜๊ฐ€ ๋“ค์–ด์™€์„œ 0 ์ธ ๊ฒฝ์šฐ์—๋Š” chunk ํ•จ์ˆ˜๊ฐ€ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์ƒํ™ฉ์ด๋ฏ€๋กœ ๋นˆ array๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค. 
// ์ฆ‰ chunk([],2) ํ˜น์€ chunk([1,2,3],0) ์ด ๋“ค์–ด์˜ค๋ฉด ๋‹ค []๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ๊ตฌ์กฐ์ด๋‹ค. 
  if (!length || size < 1) {
    return []
  }
 
  
// ์‹ค์ œ chunk๋ฅผ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜ 
// ์ฒซ index ๊ฐ’๊ณผ ๋ฐฐ์—ด์˜ ๋ฐฐ์—ด์•ˆ์— ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” chunk๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” result index์˜ index ๊ฐ’์„ 0์œผ๋กœ ์…‹ํŒ… ํ•ด์ค€๋‹ค.  
  let index = 0  
  let resIndex = 0
  
  
// chunck ๋ฐฐ์—ด์•ˆ์— ๋“ค์–ด๊ฐˆ ๋ฐฐ์—ด์˜ ๊ธธ์ด๋ฅผ ๊ตฌํ•ด์ฃผ๋Š” ์ฝ”๋“œ new ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ๋ฐฐ์—ด์˜ ๊ธธ์ด๋ฅผ ์›ํ•˜๋Š” ์‚ฌ์ด์ฆˆ๋งŒํผ ๊ตฌํ•ด์„œ ์˜ฌ๋ฆผํ•ด์ฃผ๋ฉด ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๋ฐฐ์—ด์˜ ๊ธธ์ด๋งŒํผ์˜ ์ด์ค‘ ๋ฐฐ์—ด์ด ๋งŒ๋“ค์–ด ์ง„๋‹ค. 
  
// ์ฆ‰ ์˜ˆ๋ฅผ ๋“ค์–ด chunck([1,2,3,4,5],2) ๋ฅผ ํ–ˆ๋‹ค๋ฉด 
  const result = new Array(Math.ceil(length / size))

// const result = new Array(Math.ceil(5/2))
// const result = new Array(3)
// const result = [empty ร— 3]  ->  ๊ธธ์ด๊ฐ€ 3 ์ธ ๋ฐฐ์—ด์ด ๋งŒ๋“ค์–ด ์ง€๊ณ  ์•„๋ž˜์˜ while๋ฌธ์„ ๋Œ๋ฉด์„œ result์˜ ๊ฐ๊ฐ index์— ์›ํ•˜๋Š” ๊ฐ’์„ ๋„ฃ์–ด์ค€๋‹ค. 

  while (index < length) {
    
// ์—ฌ๊ธฐ์„œ sliceํ•จ์ˆ˜๋Š” ์ผ๋ฐ˜ ์Šฌ๋ผ์ด์Šค์™€ ๋‹ค๋ฅด๊ฒŒ ์ธ์ž๋ฅผ 3๊ฐœ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ณ , ์ฒซ๋ฒˆ์งธ ์ธ์ž๋กœ sliceํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฐฐ์—ด์„ ๋„ฃ์–ด์ฃผ๊ณ  ๋‚˜๋จธ์ง€๋Š” start, end์ธ ๊ธฐ๋ณธ sliceํ•จ์ˆ˜์™€ ๊ฐ™๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค. 
   
    result[resIndex++] = slice(array, index, (index += size))
  }
// ์ฆ‰ while ๋ฌธ์„ ๋Œ๋•Œ๋งˆ๋‹ค ์ฒซ๋ฒˆ์งธ index, ๋‘๋ฒˆ์งธ index ์„ธ๋ฒˆ์งธ index์— ์•„๋ž˜์™€ ๊ฐ™์ด ๋„ฃ์–ด์ฃผ๋ฉด 
//result[0] = slice([1,2,3,4,5],0,2) [1,2]
//result[1] = slice([1,2,3,4,5],2,4 )[3,4]
//result[2] = slice([1,2,3,4,5],4,6 ) [5]

//์ „์ฒด result๋Š” [[1,2],[3,4],[5]] ๊ฐ€ ๋œ๋‹ค. 
  return result
}

export default chunk

chunk ํ•จ์ˆ˜ ์˜คํ”ˆ์†Œ์Šค ๋œฏ์–ด๋ณด๊ธฐ ๋„์•!

profile
์ฝ”๋ฆฐ์ด ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๐Ÿ’ป๐Ÿ’›๐Ÿค™๐Ÿผ

1๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2020๋…„ 12์›” 11์ผ

์ •๋ง ์œ ์ตํ•˜๋„ค์š”~!

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ