July 24th 2018
이번에는 배열의 filter method에 대해서 알아 보도록 하겠습니다.
저는 아직 초심자이지만 filter이름만 봐도 어떤 역할을 해 줄 녀석인지 대충 감을 잡을 수 있을 것 같습니다.
filter를 사용하면 callback 함수 내에 명시된 조건에 부합하는 배열의 요소만 걸러내어 새로운 배열을 만들 수 있습니다. (immutable)
Summary - Array.prototype.filter() - immutable - 조건에 부합하는 배열의 요소만 취해 새로운 배열을 형성
사용 예를 살펴 보도록 하겠습니다.
문제) Write a function called "removeElement". Given an array of elements, and a "discarder" parameter, "removeElement" returns an array containing the items in the given array that do not match the "discarder" parameter.
Notes: * If all the elements match, it should return an empty array. * If an empty array is passed in, it should return an empty array.
var output = removeElement([1, 2, 3, 2, 1], 2); console.log(output); // --> [1, 3, 1]
함수의 첫 번째 parameter로 배열을 받았고, 두 번째 parameter인 2를 포함하지 않는 새로운 배열을 생성해야 하는 문제 입니다.
filter method를 이용해 문제 해결을 해보면 아래와 같습니다.
function removeElement(array, discarder) {
return array.filter(function(cur) {
return cur !== discarder; // discarder가 아닌 요소만 새로운 배열에 추가함.
});
}
이렇게 filter method를 이용해 두 번째 parameter로 받은 숫자 2를 포함하지 않는 새로운 배열 [1, 3, 1]을 생성할 수 있습니다.
for loop를 이용해 다른 방법으로 해결을 해 보면,
function removeElement(array, discarder) {
newArr = [];
for (var i = 0; i < array.length; i++) {
if (array[i] !== discarder) {
newArr.push(array[i]);
}
}
return newArr;
}
이와 같이도 코딩을 할 수 있었습니다.
다른 방법으로 어떤 것이 있을지 생각해 보니, 지금 실력으로 떠오른 것은 slice method입니다.
function removeElement(array, discarder) {
for (var i = 0; i < array.length; i++) {
if (array[i] === discarder) {
array.splice(i, 1);
}
}
return array;
}
주의할 점은 위의 filter method는 원본은 보존하고 새로운 배열을 반환하는 반면(immutable), splice method는 기존의 배열을 수정하는 것이기 때문에 차이점에 대해 인지를 해야 합니다.