December 02, 2019
// Return all elements of an array that don't pass a truth test.
_.reject = function(collection, test) {
// TIP: see if you can re-use _.filter() here, without simply
// copying code in and modifying it
let filterTrueElem = _.filter(collection, test);
let result = _.filter(collection, function(num) {
return filterTrueElem.indexOf(num) === -1;
})
return result;
};
_.filter = function(collection, test) {
let array = [];
for(let i = 0; i < collection.length; i++) {
if(test(collection[i])) {
array.push(collection[i]);
}
}
return array;
};
_.map = function(collection, iterator) {
// map() is a useful primitive iteration function that works a lot
// like each(), but in addition to running the operation on all
// the members, it also maintains an array of results.
let result = [];
for(let i = 0; i < collection.length; i++) {
result.push(iterator(collection[i]));
}
};
위와 같이 _.map 함수를 작성하였는데,
it("should produce a brand new array instead of modifying the input array", function() {
var numbers = [1, 2, 3];
var mappedNumbers = _.map(numbers, function(num) {
return num;
});
expect(mappedNumbers).not.toEqual(numbers);
});
원본배열을 건드리지 않고 새로운 배열을 사용해 함수를 작성하였음에도 불구하고 계속 에러가 떠서 help desk 검색을 해보니.. ‘toEqual’을 ‘toBe’로 바꾸면 해결되는 문제였다..!
테스트 함수내의 numbers와 mappedNumbers는 속성 값은 같지만 참조하는 주소가 다르기 때문에 ‘not.toEqual’이 아닌 ‘not.toBe’을 사용해야 한다.
👍 참고글
어떻게 해야 함수에 전달된 parameter를 저장하여 다음에 똑같은 parameter가 들어왔을 때 저장된 값을 사용해야 하는지 고민하고 고민하다 어떻게 접근해야할지 모르겠어 구글링을 해본 결과 아래와 같은 방법으로 문제를 해결할 수 있었다.
_.memoize = function(func) {
let memo = {};
return function() {
if (memo[JSON.stringify(arguments)] === undefined) {
memo[JSON.stringify(arguments)] = func.apply(this, arguments);
// apply => 배열로 받은 argument를 인자로 바꿔 넘긴다.
}
console.log(memo);
return memo[JSON.stringify(arguments)];
};
};
이번에는 구글링을 통해 해결했지만, 오늘 알게된 개념을 잘 기억해서 다음에 응용된 문제가 나오더라도 풀 수 있도록 확실하게 짚고 넘어가자!