๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
TIL -์ผ๊ฐ„ํ•™์Šต๊ธฐ๋ก/Java Script

Call back ํ•จ์ˆ˜๋กœ Method ๋งŒ๋“ค๊ธฐ

by ___Jin 2022. 1. 24.

ํ•™์Šต๋ชฉํ‘œ

forEach() ,indexOf(), map(), slice(), reduce(), filter()์™€ ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋ฅผ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋กœ ๋งŒ๋“ค๊ณ  ๋งŒ๋“  ํ•จ์ˆ˜๋ฅผ ์ฝœ๋ฐฑํ•˜์—ฌ ๋‹ค๋ฅธ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž!๐Ÿ˜Ž

(๋น„๋™๊ธฐ์—์„œ ์ฝœ๋ฐฑ์„ ์›ํ™œํžˆ ์“ฐ๊ธฐ์œ„ํ•œ ์„ ํ–‰ํ•™์Šต)


๋งŒ๋“ ๊ฒƒ

์˜ˆ์ œ.slice() 

_.slice = function (arr, start, end) {
 
  let _start = start || 0, 
    _end = end;

  // ์ž…๋ ฅ๋ฐ›์€ ์ธ๋ฑ์Šค๊ฐ€ ์Œ์ˆ˜์ผ ๊ฒฝ์šฐ, ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค๋ถ€ํ„ฐ ๋งค์นญ
  // (ex. -1 => arr.length - 1, -2 => arr.length - 2)
  // ์ž…๋ ฅ๋ฐ›์€ ์ธ๋ฑ์Šค๋Š” 0 ์ด์ƒ์ด์–ด์•ผ ํ•œ๋‹ค.
  if (start < 0) _start = Math.max(0, arr.length + start);
  if (end < 0) _end = Math.max(0, arr.length + end);

  // `end`๊ฐ€ ์ƒ๋žต๋  ๊ฒฝ์šฐ(undefined), slice๋Š” ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค๊นŒ์ง€ ๋™์ž‘
  // `end`๊ฐ€ ๋ฐฐ์—ด์˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚  ๊ฒฝ์šฐ, slice๋Š” ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค๊นŒ์ง€ ๋™์ž‘
  if (_end === undefined || _end > arr.length) _end = arr.length;

  let result = [];
  // `start`๊ฐ€ ๋ฐฐ์—ด์˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚  ๊ฒฝ์šฐ, ๋นˆ ๋ฐฐ์—ด์„ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.
  for (let i = _start; i < _end; i++) {
    result.push(arr[i]);
  }

  return result;
};

1.take()

// _.take๋Š” ๋ฐฐ์—ด์˜ ์ฒ˜์Œ n๊ฐœ์˜ element๋ฅผ ๋‹ด์€ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.
// n์ด undefined์ด๊ฑฐ๋‚˜ ์Œ์ˆ˜์ธ ๊ฒฝ์šฐ, ๋นˆ ๋ฐฐ์—ด์„ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.
// n์ด ๋ฐฐ์—ด์˜ ๊ธธ์ด๋ฅผ ๋ฒ—์–ด๋‚  ๊ฒฝ์šฐ, ์ „์ฒด ๋ฐฐ์—ด์„ shallow copyํ•œ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.

_.take = function (arr, n) {
  if( n === undefined || n === 0){  // ์กฐ๊ฑด์— ๋งž์ง€์•Š์„ ๊ฒฝ์šฐ๋ฅผ ์œ„ํ•ด ์กฐ๊ฑด๋ฌธ 
    return [];
  }else{
    return _.slice(arr,0,n); //n์ด ์–‘์ˆ˜์ธ ๊ฒฝ์šฐ ์œ„์˜ slide()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ „์ฒด๋ฐฐ์—ด์„ ๋ฆฌํ„ดํ•œ๋‹ค
  }
};

2.forEach()

//iteratee๋Š” ์ต๋ช…ํ•จ์ˆ˜ function(letter) { iterations.push(letter); });
 *  const letters = ['a', 'b', 'c'];
 *  const iterations = [];
 *  _.each(letters, function(letter) {
 *   iterations.push(letter);
 *  });
 *  expect(iterations).to.eql(['a', 'b', 'c']);

 * iteratee๋Š” ์ฐจ๋ก€๋Œ€๋กœ ๋ฐ์ดํ„ฐ(element ๋˜๋Š” value), ์ ‘๊ทผ์ž(index ๋˜๋Š” key), 
 * collection์„ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
 *  ๋ฐฐ์—ด arr์„ ์ž…๋ ฅ๋ฐ›์„ ๊ฒฝ์šฐ, iteratee(ele, idx, arr)
 *  ๊ฐ์ฒด obj๋ฅผ ์ž…๋ ฅ๋ฐ›์„ ๊ฒฝ์šฐ, iteratee(val, key, obj)
 * ์ด์ฒ˜๋Ÿผ collection์˜ ๋ชจ๋“  ์ •๋ณด๊ฐ€ iteratee์˜ ์ธ์ž๋กœ ์ž˜ ์ „๋‹ฌ๋˜์–ด์•ผ ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 * ์‹ค์ œ๋กœ ์ „๋‹ฌ๋˜๋Š” callback ํ•จ์ˆ˜๋Š” collection์˜ ๋ชจ๋“  ์ •๋ณด๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 _.each = function (collection, iteratee) {
  //๋ฐฐ์—ด์ธ๊ฒฝ์šฐ
  if (Array.isArray(collection)){  //๋ฐฐ์—ด์ธ์ง€ ์ฒดํฌ
    for(let i = 0; i < collection.length; i++){ //์ธ์ž๋กœ ๋ฐ›์€ ๋ฑ…์—ด์˜ ๋žญ์Šค๋งŒํผ ๋ฐ˜๋ณต
    iteratee(collection[i],i,collection); //iterateeํ•จ์ˆ˜์— ์ธ์ž๋ฅผ ๋„ฃ์–ด์คŒ
    }
  //๊ฐ์ฒด  
  }else if(typeof collection === 'object'){ //๊ฐ์ฒด์ธ์ง€ ์ฒดํฌ
    for(let key in collection){   //for in์œผ๋กœ ๊ฐ์ฒด์˜ ํ‚ค ์ˆœํšŒ
      iteratee(collection[key],key,collection) // ๊ฐ’, ํ‚ค, ๋ฐฐ์—ด์„ ์ธ์ž๋กœ ๋„ฃ์–ด์คŒ
    }
  }
};

3.filter()

// _.filter๋Š” test ํ•จ์ˆ˜๋ฅผ ํ†ต๊ณผํ•˜๋Š” ๋ชจ๋“  ์š”์†Œ๋ฅผ ๋‹ด์€ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.
// test(element)์˜ ๊ฒฐ๊ณผ(return ๊ฐ’)๊ฐ€ truthy์ผ ๊ฒฝ์šฐ, ํ†ต๊ณผ์ž…๋‹ˆ๋‹ค.
// test ํ•จ์ˆ˜๋Š” ๊ฐ ์š”์†Œ์— ๋ฐ˜๋ณต ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

_.filter = function (arr, test) {
  let result = [];  //filter ํ†ต๊ณผ๋œ ์š”์†Œ ๋‹ด์•„์ค„ ๋นˆ๋ฐฐ์—ด ํ• ๋‹น
  _.each(arr, function (n)  { //๊ฐ์š”์†Œ๋ฅผ ์กฐํšŒํ•˜๋Š” each()์‚ฌ์šฉ
    if(test(n)){    //์ธ์ž n์ด testํ•จ์ˆ˜๋ฅผ truthyํ•˜๊ฒŒ ํ†ต๊ณผํ•˜๋ฉด
    result.push(n); //๋นˆ๋ฐฐ์—ด์— ์š”์†Œn์„ pushํ•จ.
    };
  });
  return result; //์ˆœํšŒํ›„ ์ƒˆ๋ฐฐ์—ด ๋ฆฌํ„ด
};

4.reduce()

_.reduce = function (arr, iteratee, initVal) { //  _.reduce(๋ฐฐ์—ด, iteratee, ์ดˆ๊ธฐ๊ฐ’)
  
  let acc = initVal //์ดˆ๊ธฐ๊ฐ’์„ ์ฃผ๊ธฐ์œ„ํ•ด acc์— inutValํ• ๋‹น
  _.each(arr, function(ele, idx){
    if(initVal === undefined && idx === 0){ 
    //์ดˆ๊ธฐ๊ฐ’์ด ์—†๊ฑฐ๋‚˜ ์ธ๋ฑ์Šค๊ฐ€ 0์ด๋ฉด acc๋Š” ์ˆœํšŒ์š”์†Œ์˜ 0๋ฒˆํ• ๋‹น
      acc = ele;
    }else{ //๊ทธ์™ธ์˜ ๊ฒฝ์šฐ์—”
      acc = iteratee(acc,ele,idx,arr); //acc์— ํ•จ์ˆ˜ ํ• ๋‹น(์š”์†Œ ๋”ํ•˜๋Š”ํ•จ์ˆ˜์ž„)
      //iteratee(์‘์ถ•๊ฐ’acc, ๋ฐ์ดํ„ฐele, ์ ‘๊ทผ์židx, ์›๋ณธ๋ฐฐ์—ด arr)
    }
  })
  return acc; ๋ชจ๋“  ์š”์†Œ๊ฐ€ ์‘์ถ•๋จ acc๋ฆฌํ„ด
};

//์›๋ž˜ ์ด๋ ‡๊ฒŒ ์”€
// return arr.reduce((acc,cur)=>{
//   return acc+ cur
// },0)//initval

 

๋Š๋‚€์ 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ–‰๋‹˜๋“ค ๋ฉ”์„œ๋“œ ๋งŒ๋“ค์–ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

ํ•„์š”ํ•œ ๋ฉ”์„œ๋“œ ์“ธ๋•Œ๋งˆ๋‹ค ๊ฐ์‚ฌํ•œ ๋งˆ์Œ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค..๐Ÿ˜ข

 

์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ์ƒ์š”ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ตํžˆ๊ณ , ๋ฉ”์„œ๋“œ์˜ ๋กœ์ง์„ ์•Œ์•„๊ฐ€๋Š” ์‹œ๊ฐ„์ด ๋˜์—ˆ๋‹ค.

์ฝœ๋ฐฑ๊ณผ ์žฌ๊ท€,์ž๋ฃŒ๊ตฌ์กฐ๋Š” ์ž˜ ์ตํ˜€๋‘์–ด์•ผ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.

 


๋‹ค์Œ ๊ณต๋ถ€๋ฐฉํ–ฅ

๋‚ด์ผ์€ ๋น„๋™๊ธฐ๋ฅผ ๋ฐฐ์šด๋‹ค.

๋น„๋™๊ธฐ ๊ณผ์ œ์‹œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•˜๋‹ˆ, ๋‚ด์ผ๋„ ๋ธ”๋กœ๊ทธ ์ •๋ฆฌ๋ฅผ ํ•ด๋‘์–ด์•ผ ๊ฒ ๋‹ค.

๋Œ“๊ธ€