12월 30일 복기

Ji Taek Lim·2020년 12월 30일
0

오늘은 언더바에 대해서 해보았다.

_.zipStrict


[1]
[1,2]
[1,2,3]
[1,2,3,4]

어떻게 비교하나? arg.length = 4
첫번째를 기준으로 잡는다. 그다음에 하나씩 비교한다. 


_.zipStrict은 _.zip과 비슷하게 동작하지만,
최종적으로 리턴되는 배열의 각 요소의 길이는 입력으로 전달되는 배열 중 가장 '짧은' 배열의 길이로 통일됩니다.
그 외 조건은 앞서 _.zip과 동일합니다.


_.zipStrict = function (...arg) {
  let result = [];
  let minLength = arg[0].length ///// 첫번쨰의 길이를 기준으로 잡는다. 그다음에 하나씩 비교한다.//Initial Value;/// 지금까지 가장 작은값
  for(let i =0; i < arg.length; i++) {
    if(minLength > arg[i].length) { /// 다음에 오는 값이 전에 값보다 작은 경우
      minLength = arg[i].length;
    }
  }
  _.each(arg, function(ele,i) {
    if(i===0) {
      for(let j=0; j <minLength; j++) {
        result.push([ele[j]]);
      }
    }else {
      for(let j=0; j <minLength; j++) {
        result[j].push(ele[j])
      }
    }
  });
  return result;
};

_.intersection

/ TODO;
/ 교집합 배열에 대해서 어떻게 접근해야하나?
/ rest parameter
/ ...arg 를 순회를 한다.
/ for 문으로 배열을 순회를 한다. ... 
/ 기준이 있다. 첫번째 입력인 배열을 기준으로 합니다. --> 초기값을 가지고 pivot
/ 첫번째만 가지고 있으면 된다.
/ 첫번째의 배열의 순서대로 출력을 해야한다. ---> 출력값은 초기갑 배열의 순서...
/ 첫번쨰 배열으 순회한다. for문으로 순서를 정한다. 

/ ...arg 를 순회하고 arg[0]의 배열으 순회해야한다. 2/ arg[0] 을 돈 값을 가지고 나버지 배열의 값을 비교해야되는데 
/ 값이 있는지 없는 지 판단을 할 수 있나? 
/ arg[0] 의 값을 가지고 for 문을 돌면서 include로 확인을 해주면 된다. 

/ 새로운 배열에 push 를 해주는데 result =[]하나

 먼저 arg[0] argument들을 찾는다.

 어떻게 비교를 할것인가? 

arr[0] = [ a, b, c, d ];
arr[1] = [];
arr[2] = [];

/ 순서가 첫번째에 있는 값을 돌고 
/ 그다음에 다음 배열에 가서 같은것을 찾는다.


/ 있냐 없냐를 따지고
있는지 없는지 구분하는 함수. _.include
_.intersection = function (...arg) {

  let firstArr = arg[0]

  let newArr =[];

  for(let i=0; i <firstArr.length; i++) {
    for(let j=1; j<arg.length; j++) {
      if(_.includes(arg[j],firstArr[i])) {
        newArr.push(firstArr[i]);
      }
    }
  }
  return newArr;
};

여기서 결과값은 jin이 3번 나오는것과

-> jin이 한번나와야하고

rm은 두번째 배열만 겹치는데 rm 이 출력된것
-> rm은 안나와야한다.


// 여기서 결과값은 jin이 3번 나오는것과

// -> jin이 한번나와야하고

--> jin이 3번 나오지 않게 하기 위해서는 if 

// rm은 두번째 배열만 겹치는데 rm 이 출력된것
// -> rm은 안나와야한다.

--> 두번째 조건을 해결하면 첫번째가 풀린다?

--> push 를 겹치면 무조건 하고 있습니다. 

다른 모든 배열들을 모두 순회해서  --> 모든 배열에 있었다면 push를 한다.

모든 배열을 순회하는 for문에 가서 조건을 걸어준다.


/ 존재하는지 안하는지 모든 요소에 존재하는지 안하는지 한번에 확인하기가 어렵다.??

/ 다 존재할때라는 것을 가지고 있어야한다. for 문이 끝나고 확인을 해줘야한다. 마지막에 if 문이 나온다. 잘모르겠지만..

그래서 count를 써준다. count를 지정해줘서 if 문에 대한 정보까지 출력가능.

_.intersection = function (...arg) {

  let firstArr = arg[0]

  let newArr =[];
  let count = 0

  for(let i=0; i <firstArr.length; i++) {
    count = 0  /// 새로운 요소가 들어오면 count가 0이 되어야 되서 0이다. 
    for(let j=1; j<arg.length; j++) {
      if(_.includes(arg[j],firstArr[i])) { /// 존재하는가에 대한 for문이고
        count +=1
      }
    }
    if(count === arr.length-1) { // 첫번째 배열을 제외하고 count를 하기 때문에 -1을 해준다.
      newArr.push(firstArr[i])
    }
    // 다 존재하는가에 대한 것을 확인해준다. 유효성 검사..
  }
  return newArr;
};

/// 나머지 배열에 없는 요소들만 가져온다. 

// arg[0]이 기준이다.

// ...arg를 for문을 돌아서 순회를 한다.

// 존재하면 count를 올려준다. 안에 있는 요소중에서 하나라도 겹치는게 있으면 push를 하면 안된다. 
/// 하나라도 있으면 안된다라는 조건이고 true false; count =0 일때 return이다. true false return으로도 할 수 있다
_.difference = function (...arg) {
  let firstArr = arg[0];

  let newArr = [];
  let count = 0;

  for(let i =0; i < firstArr.length; i++) {
    count = 0
    for(let j=1; j <arg.length; j++) {
      if(_.includes(arg[j],firstArr[i])) {
        count +=1
      }
    }
    if(count === 0) {
      newArr.push(firstArr[i])
    }
  }
  return newArr;
};

_.difference = function (...arg) {
  let firstArr = arg[0];
  let newArr =[];
  let isExist = false;

  for(let i =0; i < firstArr.length; i++) {
    isExist = false;
    for(let j=1; j <arg.length; j++) {
      if(_.includes(arg[j],firstArr[i])) {
        isExist =true;
      }
    }
    if(!(isExist)) {
      newArr.push(firstArr[i])
    }
  }
  return newArr;
}

intersection에 isExist를 쓰면 안되는 이유

isExist를 쓰면 새롭게 갱신이 되면서 이전의 값들이 rm이 마지막 배열을 돌면서 true로 바뀐다.

rm은 두번째 배열만 겹치는데 rm 이 출력된것
-> rm이 마지막 배열에 있으니까 출력이 된다. 

갱신이 계속 되는데 rm이 마지막 배열에만 존재했을경우는
중간에는 false 인데
마지막에는 true가 되면서 출력

_.intersection = function (...arg) {

  let firstArr = arg[0]

  let newArr =[];
  let ExistAll = false;

  for(let i=0; i <firstArr.length; i++) {
    ExsitAll = false;
    for(let j=1; j<arg.length; j++) {
      if(_.includes(arg[j],firstArr[i])) { /// 존재하는가에 대한 for문이고
        ExsitAll =true;
      }
    }
    if(ExistAll) { // 첫번째 배열을 제외하고 count를 하기 때문에 -1을 해준다.
      newArr.push(firstArr[i])
    }
    // 다 존재하는가에 대한 것을 확인해준다. 유효성 검사..
  }
  return newArr;
};

_.sortBy

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

역접이다. a-b a가 뒤에 나오는 parameter

b는 처음에 나오는 parameter

플러스가 나오면 뒤에서 앞을 빼니까 오름차순이고

profile
임지택입니다.

0개의 댓글