프로그래밍 월드/Javascript & jQuery

[Javascript] 자바스크립트의 filter에 대하여 알아보자.

용가리TM 2025. 3. 14. 16:31
반응형

1. 기본 문법

const newArray = originalArray.filter(callback(element[, index[, array]])[, thisArg]);
  • originalArray: 원본 배열.
  • callback: 배열의 각 요소에 대해 실행할 함수.
    • element: 현재 처리 중인 요소.
    • index (선택): 현재 요소의 인덱스.
    • array (선택): filter()를 호출한 배열 자체.
  • thisArg (선택): callback 함수 내에서 사용될 this 값.

2. 콜백 함수의 역할

콜백 함수는 배열의 각 요소마다 호출되며, 각 호출 시 다음과 같이 전달됩니다:

  • element: 현재 요소.
  • index: 현재 요소의 인덱스.
  • array: 원본 배열 전체.

콜백 함수는 true 또는 false를 반환해야 합니다.

  • true를 반환하면, 해당 요소는 새 배열에 포함됩니다.
  • false를 반환하면, 해당 요소는 제외됩니다.

예를 들어:

const numbers = [1, 2, 3, 4, 5];
const evenNumbers = numbers.filter((num) => {
  return num % 2 === 0;  // 짝수일 경우에만 true 반환
});
console.log(evenNumbers); // [2, 4]
 

3. thisArg 매개변수

두 번째 인자로 전달하는 thisArg는 콜백 함수 내부에서 this로 사용됩니다.

예를 들어, 객체의 속성을 비교할 때 유용합니다:

 
const context = { threshold: 10 };
const numbers = [5, 12, 8, 130, 44];

const filtered = numbers.filter(function(num) {
  return num > this.threshold;
}, context);

console.log(filtered); // [12, 130, 44]

4. 다양한 사용 예제

4.1. 배열 내의 객체 필터링

객체 배열에서 특정 조건을 만족하는 객체만 골라낼 수 있습니다.

const users = [
  { name: 'Alice', age: 25 },
  { name: 'Bob', age: 30 },
  { name: 'Charlie', age: 35 }
];

const usersOver30 = users.filter(user => user.age > 30);
console.log(usersOver30); // [ { name: 'Charlie', age: 35 } ]

4.2. 중첩 배열에서 특정 요소 제거

특정 값이 포함된 배열을 제거하는 경우:

const fruits = ['apple', 'banana', 'orange', 'banana'];
const filteredFruits = fruits.filter(fruit => fruit !== 'banana');
console.log(filteredFruits); // ['apple', 'orange']

4.3. 조건에 따른 복합 필터링

여러 조건을 조합하여 필터링할 수도 있습니다.

const items = [
  { name: 'Book', price: 12, inStock: true },
  { name: 'Pen', price: 2, inStock: false },
  { name: 'Notebook', price: 5, inStock: true }
];

const affordableInStock = items.filter(item => item.inStock && item.price < 10);
console.log(affordableInStock); // [ { name: 'Notebook', price: 5, inStock: true } ]

5. filter()의 특성과 주의 사항

  • 불변성 유지: filter()는 원본 배열을 변경하지 않고, 조건에 맞는 요소들로 새 배열을 생성합니다.
  • 희소 배열(Sparse Array): 배열 내에 비어있는 요소(holes)가 있는 경우, 해당 빈 요소들은 callback 함수에서 호출되지 않습니다.
  • 반환 값: 조건에 맞는 요소가 하나도 없으면 빈 배열 ([]) 을 반환합니다.
  • 고차 함수(Higher-Order Function): filter()는 콜백 함수를 인자로 받으므로, 다른 함수와 조합하여 사용하기 좋습니다.
  • 실행 순서: 배열의 각 요소에 대해 순서대로 콜백 함수가 호출됩니다. 따라서 인덱스에 의존하는 조건문 작성 시 주의해야 합니다.

6. filter()와 다른 배열 메서드 비교

  • map(): 배열의 각 요소를 변환하여 새 배열을 만듭니다. (길이는 동일)
  • reduce(): 배열의 모든 요소를 누적하여 하나의 값으로 축소합니다.
  • find(): 조건을 만족하는 첫 번째 요소만 반환합니다.
  • forEach(): 배열의 각 요소에 대해 주어진 함수를 실행하지만, 반환 값을 저장하지 않습니다.

filter()는 배열에서 특정 조건에 맞는 요소들만 골라내는 데에 최적화되어 있으며, 반환된 배열은 원본 배열과 별개이므로 후속 조작에 안전하게 사용할 수 있습니다.


7. 결론

JavaScript의 filter() 메서드는 배열 데이터를 다룰 때 매우 강력하고 유연하게 사용할 수 있는 도구입니다. 다양한 상황에서 원하는 조건에 맞는 데이터를 선별하고, 원본 배열을 건드리지 않으면서 새로운 배열을 생성할 수 있기 때문에, 코드의 가독성과 유지보수성을 높이는 데 큰 도움을 줍니다.

이처럼 filter()의 기본 사용법부터 고급 사용법까지 이해하면, 복잡한 데이터 필터링 작업도 간단하고 직관적으로 해결할 수 있습니다.

반응형