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 (의사코드) >
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]