analogcoding

Array Method - 이해하기 + 본문

Study JS for me/Array Method

Array Method - 이해하기 +

be well 2019. 4. 23. 16:58

지난번에 이어 underscore 형식의 메소드를 작성해본다.

 


_.uniq 

말 뜻 그대로 유니크한, 중복되지 않는 것만 가려내서 리턴한다.

// Ex) let arr = [1,1,2,2,3,4,3]  => [1,2,3,4]

_.uniq = function(array) {
  let result = [];
    for(let i = 0; i < array.length; i++){
      if(!result.includes(array[i])){
//  빈 배열이 array[i]를 포함하고 있는지 없는지 확인하면서 집어넣음으로 중복을 제거.
        result.push(array[i])
      }
    } 
    return result;
}

 


_.contains

주어진 인자가 node 의 자손인지, 아닌지에 대해 Boolean 값으로 리턴한다.

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

 


_.extend

주어진 다수의 객체를 하나로 합친다. 객체가 동일한 프로퍼티를 가지게 되는 경우 나중에 오는 값이 최종값으로 남아 리턴된다.

_.extend = function(obj){
  for(let i = 0; i < arguments.length; i++){
// 다수의 obj에 접근하기 위해 arguments[i]를 구한다.
    for(let key in arguments[i]){
      arguments[0][key] = arguments[i][key]
// 맨 앞 객체의 프로퍼티의 값을 나중에 오는 값으로 덮어쓴다.
    }
  }
  return arguments[0]
}

 


_.defaults

주어진 다수의 객체에서 없는 프로퍼티는 추가하고 동일한 프로퍼티의 경우 먼저 있던 값을 최종값으로 리턴한다.

_.defaults = function(obj){
  for(let i = 0; i < arguments.length; i++){
    for(let key in arguments[i]){
      if(!obj.hasOwnProperty()){
//  obj가 프로퍼티를 가지고 있지 않다면 값을 대입한다.
        obj[key] = arguments[i][key]
      }
    }
  }
  return obj;
}

 


_.delay ( setTimeOut )

주어진 시간이 만료된 뒤 지정된 함수나 코드를 실행하는 타이머를 설정한다.

delay 는 타이머가 지정된 함수나 코드를 실행시키기 전에 기다려야할 ms(1000분의 1초). 생략 시 0의 값으로 사용된다.

_.delay = function(func,wait){
  let args = [...arguments].slice(2);
// 타이머가 만료되고 func에 전달되는 추가적인 매개변수

setTimeOut(function(){
  func(..args)},wait);
// 실행될 함수 , 시간
};

 


_.once

실행된 함수가 다른 값을 받아도 첫번 째로 실행된 값을 계속 리턴한다.

_.once = function(func){
  let result;
  let firstCall = false;
// firstCall의 값을 바꿔서 더 이상 다른 값을 받아드리지 못하게 함
  return function(){
    if(!fristCall){
      result = func(...arguments)
      firstCall = true;
    }
    return result;
  }
}

 


_.flatten

모든 하위 배열 엘리먼트를 지정된 깊이까지 재귀적으로 이어붙여 새로운 배열을 생성한다.

_.flatten = function(nestedArray,result){
  var result = [];
// let 을 쓰면 Identifier 'result' has already been declared 오류가 난다.
    for(let i = 0; i < nestedArray.length; i++){
      if(!Array.isArray(nestedArray[i])){
        result.push(nestedArray[i])
// nestedArray의 각 요소가 배열에 들어있지 않으면 result에 push.
      }
      else{
        result = result.concat(_.flatten(nestedArray[i]))
// result에 배열에 든 nestedArray[i]를 재귀적으로 concat해서 []를 없앤다.
      }
    }
    return result;
}

 


_.shuffle

배열의 요소를 원래 순서가 아닌 다른 순서로 새 배열에 리턴한다.

// 원 배열과 다른 새 배열을 만드는데 2가지 방법을 사용했다.

// 1. 순서만 바꾸는 방법

_.shuffle = function(array){
  let copy = Array.prototype.slice.call(array);
  // 원 배열에 영향을 주지 않기 위해 복사본 copy 생성.
  let result = [];
    for(let i = 1; i < copy.length; i++){
      result.push(copy[i]);
    }
    result.push(copy[0])
    return result;
}

// 2. 요소를 랜덤으로 다시 넣는 방법

_.shuffle = function(array){
  let copy = Array.prototype.slice.call(array);
    for(let i = 0; i < copy.length; i++){
      copy[i] = array[Math.floor(Math.random() * array.length)]
// copy의 요소에 같은 요소를 가진 array의 값을 반복적으로 넣어준다.
      for(let j = 0; j < i;  j++){   
        if(copy[j]===copy[i]){
         i--;                 
// 들어온 값이 같을 경우 다시 i--를 통해 다시 증감식으로 이동.
        }
      }
    }
    return copy;
};

// for문의 작동 순서 1.초기화 2.조건 3.실행 4.증감식 

 


다른 효율적인 방법도 많을 것이고  내 코드가 잘못 작성됬다고 생각할 수 있는 부분이 많을 것이다.

 

아직 많이 부족하고 그나마 가장 익숙한 if 와 for 처럼 기본적인 방법으로 풀어내보았다.

 

아직 많이 부족한 내가 더 효율적이고  모든 testcase에 작동하는 코드를 작성하기 위해

 

앞으로 계속 연습하며 내가 언제든 참조할 수 있게 적어놓았다.

'Study JS for me > Array Method' 카테고리의 다른 글

Array Method - 이해하기  (0) 2019.04.23
Array Method -2  (1) 2019.04.22
Array method - 1  (0) 2019.04.21
Comments