1. _.uniq
it('should return all unique values contained in an unsorted array', function() {
  var numbers = [1, 2, 1, 3, 1, 4];

  expect(_.uniq(numbers)).to.eql([1, 2, 3, 4]);
});
// 중복된 값을 제외한 배열을 출력하는 문제

< 강사님 코드 따라해보기 >

/*
 * element가 중복됐는지 아닌지 확인할 수 있는 공간을 만듭니다.
 * 결과를 리턴해줄 새로운 배열을 만든다
 * 배열을 loop
 * 지금의 element가 중복되었는지 확인할 수 있는 공간에 넣어줍니다.
 * 그 공간에 element가 있다면
 *  - 중복된 것이니까 아무것도 하지 않는다
 *  - 없다면 새로 만든 배열에 element를 집어넣어준다 
 */
const lookUpTable = {}; // 중복을 확인하기 위한 공간
const result = [];

for(let i = 0; i < array.length; i++) {
  if(!(array[i] in lookUpTable)) { 
    // 지금의 엘리먼트를 중복되었는지 확인할 수 있는 공간에 넣어줍니다.
    result.push(array[i]);
    lookUpTable[array[i]] = true;
    console.log(lookUpTable);
  }
}
return result;

나는 의사코드로 설계를 하는 것이 익숙하지도 않고
어렵기만 해서 설계과정을 생략하고 코드를 먼저 입력하곤 했었는데
앞으로는 강사님처럼 의사코드로 먼저 설계를 한 후에
코드를 입력하는 습관을 가져보도록 해야겠다.

출처 : https://sujinlee.me/pseudocode/
< pseudocode (의사코드) >

  • 코드는 컴퓨터 프로그램이나 알고리즘이 수행해야할 내용을 우리가 사용하는 언어 (한국어 또는 영어 등)로 간략히 서술해 놓은 것을 말합니다
  • 실제 코딩하기 전 사고를 좀더 명확히 정립하게 만들어 준다.
    처음 코딩을 할 때가 제일 힘들다. 단순히 소스코드를 입력하는 것보다 함수(function) 프로그램을 만들 때 많은 시간을 낭비할 수 있다. 약 10분 정도 각 풀이법의 장점과 단점을 주도면밀하게 살펴보면서 의사코드 작성한다면, 이후 디버그를 수정하고 코드를 재분해 하는데 걸리는 시간을 단축할 수 있다.
  1. _.defaults

defaults 함수를 만드는 문제에서는
과정 설계를 해보았다.

강사님 처럼 과정을 설계하고 코드입력에 들어가니
중간중간 고민하는 시간을 줄일 수 있어 도움이 되었다

_.defaults = function(org, ...obj) { 
    /*
     * 1. 중복값을 체크해줄 공간을 만든다
     * 2. 기본값을 먼저 그 공간에 넣어준다
     * 3. 중복값 체크 공간에 없는 요소만 합쳐준다.  
     */
    let lookUpList = {}; // 중복값을 체크해줄 공간
    for(let key in org) {
      lookUpList[key] = 'true'; 
      // 기본값을 먼저 그 공간에 넣어준다
    }
    for(let elem of obj) {
      for(let key in elem) {
        if(!(key in lookUpList)) {
          // 중복값 체크 공간에 없는 요소만 합쳐준다.  
          org[key] = elem[key];
          lookUpList[key] = 'true';
        }
      }
    }
    return org;
  };
var destination = {};
var source = { a: 1 };
var anotherSource = { a: 'one' };

_.defaults(destination, source, anotherSource);

이번 문제를 풀면서 알게되 사실 ▼

Rest 파라미터가 단독으로만 쓸 수 있는 아이인줄 알았는데
function(org, ...obj) => 이렇게 고정값이 되는 요소와 같이 사용해도
된다는 것을 알게되었다.

Rest 파라미터를 사용하면 새로 추가할 요소가 생길때 마다
function(org, obj1, obj2, ob3) 이렇게 추가해줄 필요 없어서 너무 편리한 것 같다.

< mdn 검색 결과 >
Rest 파라미터 구문은 정해지지 않은 수(an indefinite number, 부정수) 인수를 배열로 나타낼 수 있게 합니다.

// 예시
function myFun(a, b, ...manyMoreArgs) {
  console.log("a", a); 
  console.log("b", b);
  console.log("manyMoreArgs", manyMoreArgs); 
}

myFun("one", "two", "three", "four", "five", "six");

// a, one
// b, two
// manyMoreArgs, [three, four, five, six]