TIL(20.03.06)

TheJang·2020년 3월 9일
0

TIL

목록 보기
10/33

CODESTATES 3주차 #6

<회고>
오늘도 저번시간에 진행한 언더바에 문제풀이를 하였다. 배열메소드에 대한 내용과 동기 비동기개념 그리고 객체의 확장성 에 대해 문제를 해결하며 적용 시켜보았다. 동기 비동기 개념은 오늘 처음 배운 개념이기 때문에 따로 정리 해야할 필요가 있다고 생각이 들었다.

< 오늘 배운 것들>

  • callback

  • 동기 sync

  • 비동기 async

  • arguments, ...args ,window

underbar과제

< part2 >

_.contains

배열 또는 객체가 주어진 값을 포함 하는지 체크하는 함수를 만드는 문제입니다.

  • 풀이 1
 _.contains = function(collection, target) {
    let result = false;
    _.each(collection,function(el){
      if( el === target){
        result = true;
        return result;
      }
    })
    return result;
  };

이전 each함수를 통해 요소들이 비교 대상과 같으면 true만들도록해서 값이 나오게 구현 하였다.

  • 풀이 2
_.contains = function(collection, target) {
    if(Array.isArray(collection)){
      for(let i = 0 ; i < collection.length; i++){
        if(collection[i] === target){
          return true;
        }
      }
    }else {
      for(let key in collection){
        if(collection[key] === target){
          return true
        }
      }
    }
    return false; 
  };

단순하게 for문을 사용하여 배열일때와 객체일때를 나누어 구현 하였다.

_.every

모든 요소가 iterator에 의해 값이 전달이 되는지 확인 하는 문제입니다.

_.every = function(collection, iterator) {

    
   if(iterator === undefined){
     iterator = _.identity;
   }
   
   for(let i =0 ; i < collection.length; i++){
     if(!iterator(collection[i])){
       return false;
     }
   }
   return true;
  };

iterator가 undefined로 되었을때 identity함수를 써 값을 가져와 주었고 나머지는 iterator에 넣어 확인 해 주었습니다.

_.some

element가 하나라도 iterator에 의해 truthy한지 체크하는 문제입니다.

_.some = function(collection, iterator) {

    return !_.every(collection,function(el){
      if(iterator === undefined){
        iterator = _.identity;
      }
      return !iterator(el);
    })
  };

기존의 every의 값을 부정해주어 문제를 해결했다.

_.extend

주어진 객체를 전달된 모든 속성으로 확장하는 문제입니다.

_.extend = function(obj) {
    for(let i =0 ; i < arguments.length; i++){
      for(let key in arguments[i]){
        obj[key] = arguments[i][key];
      }
    }
    return obj;
  };

obj파라미터가 여러개가 될 수있기때문에 arguments로 여러개의 파라미터를 정해주고 obj객체에 삽입 해주어 문제를 해결했다.
문제를 접근하는데 있어 arguments를 사용하는것을 찾는데 시간이 좀 걸렸고 직접 코드에 직접 적용시키면서 arguments에 대해 이해도를 높였다.

_.defaults

extend와 비슷하지만 이미 존재하는 key 대해 값을 덮어쓰기 하지 않게 구현하는 문제입니다.

_.defaults = function(obj) {
    for(let i=0; i < arguments.length; i++){
      for(let key in arguments[i]){
       if(!obj.hasOwnProperty(key)){
         obj[key] = arguments[i][key];
       }
      }
    }
    return obj;
  };

hasOwnProperty메소드를 사용하여 객체에 키값이 있는지 유무를 판단 한뒤 삽입 처리를 하면서 문제를 해결하였다.

_.once

클로저 문제입니다.

_.once = function(func) {

 let alreadyCalled = false;
    let result;
    
    return function() {
      if(alreadyCalled === false){
        result = true;
      }

      return result;
    };
  };

문제를 접근하는데 있어서 클로저 개념을 적용하였고 사용하면서 클로저에 대한 이해도를 높였다.

_.delay

원래 함수에 대한 argument는 wait parameter 뒤에 전달되게 만드는 함수입니다.

_.delay = function(func, wait,...args) {
    
    setTimeout(function(){
      func(...args);
    },wait);
  };

setTiemout메소드를 사용하여 동기 비동기을 적용시켰다.

_.flatten

다차원 배열을 가져와 1차원 배열로 반환하는 문제입니다.

  • 풀이1
_.flatten = function(nestedArray, result) {
    return _.reduce(nestedArray, function(acc, val){
      if (Array.isArray(val)) {
        return acc.concat(_.flatten(val))
      }
      return acc.concat(val)
    },[])
  };

reduce 함수와 콜백의 개념을 이용하여 해결 하였다.

  • 풀이 2
 _.flatten = function(nestedArray, result) {
    let newArr= [];

    for(let i =0; i < nestedArray.length; i++){
      if(!Array.isArray(nestedArray[i])){
        newArr.push(nestedArray[i]);
      }else {
          newArr = newArr.concat(_.flatten(nestedArray[i]));
        }
    }
    return newArr;
  };

콜백을 이용해 해결

_.shuffle

 _.shuffle = function(array) {
    let newArr = [];
    let arr = array.slice();
    let randomindex = Math.floor(Math.random() * arr.length);

    for(let i = 0; i < arr.length; i++){
      
    }

  };

ADVANCED 과제는 차후에 ㅎㅎ

profile
어제보다 오늘 더 노력하는 프론트엔드 개발자

0개의 댓글