lodash - sortedUniq ๐Ÿ”–

Jung Hyun Kimยท2021๋…„ 2์›” 2์ผ
1

lodash

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

lodash

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

https://lodash.com/docs/4.17.15#sortedUniq

1.sortedUniq

  • ์ด๋ฆ„์ฒ˜๋Ÿผ ์ค‘๋ณต๋˜์ง€ ์•Š๋Š”(Unique) sorted๋œ array์ค‘์—์„œ ์ค‘๋ณต๋˜์ง€์•Š๋Š” ์š”์†Œ๋งŒ ๋ณด์—ฌ์ฃผ๋Š” ํ•จ์ˆ˜์ด๋‹ค. ์ฆ‰ ๋ฐฐ์—ด์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›๊ณ , ์ค‘๋ณต๋œ ๊ฐ’์„ ์ง€์šด ๋ฐฐ์—ด(new duplicate free array)์„ return ํ•œ๋‹ค. ์•„์˜ˆ ์ค‘๋ณต๋˜์ง€ ์•Š์€ ์ˆ˜๋ฅผ ๋ณด์—ฌ์ฃผ๋Š”๊ฒŒ ์•„๋‹Œ, neigboring value๊ฐ€ ์ค‘๋ณต๋˜๋Š”๊ฑธ ๋ง‰๋Š” ํ•จ์ˆ˜์ด๋‹ค.
sortedUniq([1, 1, 2]) // ์ด๋ ‡๊ฒŒ ํ˜ธ์ถœํ•˜๋ฉด 
=> [1, 2] // ์š”๋ ‡๊ฒŒ ๊ฐ๊ฐ ๋‘๊ฐœ์”ฉ ๋ฌถ์€ ๋ฐฐ์—ด์„ ๋ณด์—ฌ์ค€๋‹ค. 
sortedUniq([1, 1, 2, 1]) // ์ด๋ ‡๊ฒŒ ํ˜ธ์ถœํ•˜๋ฉด 
=> [1, 2, 1] // ์š”๋ ‡๊ฒŒ ๊ฐ๊ฐ ๋‘๊ฐœ์”ฉ ๋ฌถ์€ ๋ฐฐ์—ด์„ ๋ณด์—ฌ์ค€๋‹ค. 

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

function sortedUniq(array) {
      return (array && array.length)
        ? baseSortedUniq(array)
        : [];
    }

function baseSortedUniq(array, iteratee) {
  let seen
  let index = -1
  let resIndex = 0

  const { length } = array
  const result = []

  while (++index < length) {
    const value = array[index], computed = iteratee ? iteratee(value) : value
    if (!index || !eq(computed, seen)) {
      seen = computed
      result[resIndex++] = value === 0 ? 0 : value
    }
  }
  return result
}

export default baseSortedUniq

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

  1. ๋จผ์ € ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›๋Š” array๊ฐ€ ์œ ํšจํ•œ array์ธ์ง€ ๊ฒ€์ฆํ•˜๋Š” ์ ˆ์ฐจ๋ฅผ ๊ฑฐ์นœ๋‹ค.
function sortedUniq(array) {
  //  array ๊ฐ€ undefined ํ˜น์€ array๊ธธ์ด๊ฐ€ 1 ์ด์ƒ์ด๋ผ๋ฉด baseSortedUniq(array)๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์•„๋‹ˆ๋ฉด ๋นˆ array๋ฅผ return ํ•œ๋‹ค. 
      return (array && array.length)
        ? baseSortedUniq(array)
        : [];
    }
  1. baserSotredUniq(array)ํ•จ์ˆ˜๋ฅผ ๋ณด์ž๋ฉด array์ด์™ธ์— iteratee๋„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›๋Š” lodashํ•จ์ˆ˜์ด์ง€๋งŒ ์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ array๋งŒ ๋„˜๊ฒจ์ค„ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์‹ค์ƒ iteratee๋Š” undefined๊ฐ€ ๋“ค์–ด์™”๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

    ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋‘๊ฐœ ๋ฐ›๋Š” ํ•จ์ˆ˜์— ํ•˜๋‚˜๋งŒ ์ „๋‹ฌํ•˜๊ณ  console์„ ์ฐ์œผ๋ฉด undefined๊ฐ€ ์ฐํžˆ๋Š”๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

function baseSortedUniq(array, iteratee) {
  
  // ์ฒซ index๋ฅผ -1๋กœ ์ง€์ •ํ•ด์ฃผ๊ณ  ๋ฐ‘์— while๋ฌธ์„ ์‹คํ–‰ํ•˜๊ธฐ์ „ ++index prefgix๋กœ 1์”ฉ ๋”ํ•ด์ค„ ์˜ˆ์ •
  let seen
  let index = -1
  let resIndex = 0
  const { length } = array         
  
  // ๊ฒฐ๊ณผ ๊ฐ’์„ ๋‹ด์„ ๋นˆ array
  const result = []
            		
      // ๋ฐฐ์—ด์˜ ๊ธธ์ด๋ณด๋‹ค ํ•˜๋‚˜ ์ž‘์€ index๊ฐ’ ๋งŒํผ ๋ˆ๋‹ค. ์ฆ‰ ๋ชจ๋“  array๋ฅผ ๋Œ๋•Œ ๊นŒ์ง€ ์‹คํ–‰ํ•˜๋Š” while ๋ฌธ 
      while (++index < length) {
        
        // array์˜ index์˜ value๋ฅผ ๋ณ€์ˆ˜ value์— ๋‹ด๋Š”๋‹ค 
       // computed ๋ณ€์ˆ˜๋„ iteratee๊ฐ€ undefined์ด๋ฉด ํ•ด๋‹น value๋ฅผ computed ๋ณ€์ˆ˜์— ๋‹ด๋Š”๋‹ค. (ํ˜„์žฌ์˜ ๊ฒฝ์šฐ์— ํ•ด๋‹น)     
        const value = array[index],
            computed = iteratee ? iteratee(value) : value;
       
        //  ๋‘ ๊ฐ’์„ ๋น„๊ตํ•˜๋Š” .eq lodash ํ•จ์ˆ˜๊ฐ€ ์‚ฌ์šฉ๋˜์—ˆ๋‹ค. 
        // console.log(_.eq("Geeks", "Geeks" )); => true ๋ฅผ ๋ฆฌํ„ดํ•จ 
        // !index๋Š” index๊ฐ€ 0์ด๊ฑฐ๋‚˜ ํ˜น์€ computed!==seen ์ด ์•„๋‹Œ๊ฒฝ์šฐ,
        // ์ฆ‰ ๋งจ์ฒ˜์Œ loop์—์„œ ํ•ด๋‹น if๋ฌธ์„ ํƒ€๊ฑฐ๋‚˜ ํ˜น์€ ์ด์ „์— ์ €์žฅํ•œ computed๊ฐ’๊ณผ seen์ด ๋‹ค๋ฅผ๋•Œ ํ•ด๋‹น if ๋ฌธ์„ ํƒˆ ๊ฒƒ์ด๋‹ค. 
        if (!index || !eq(computed, seen)) {
          
          // ํ•ด๋‹น loop์—์„œ์˜ computed๊ฐ’์„ seen์— ๋„ฃ์–ด์ค€๋‹ค. 
           seen = computed;
          // ์ด์ „ ๊ฐ’๊ณผ ์ค‘๋ณต๋˜์ง€ ์•Š์„ ๊ฒฝ์šฐ์—๋งŒ value๋กœ ๋„ฃ์–ด์ค€๋‹ค. 
          result[resIndex++] = value === 0 ? 0 : value;
        }
      }
      return result;
    }
profile
์ฝ”๋ฆฐ์ด ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๐Ÿ’ป๐Ÿ’›๐Ÿค™๐Ÿผ

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