[underscore.js] _.filter( ) 함수

Cheonmyung Ro
3 min readMar 7, 2018

underscore.js의 collection 중에서 _.filter( ) 함수에 대해 알아보자.

filter _.filter(list, predicate, [context])
list: colletion으로써, 배열이나 객체가 될 수 있다.predicate: list의 각 element(value)의 결과값이 truth인지 확인하는 test 함수이다.[context]: predicate 함수에서 this로 바인딩 되는 것이다.(생략가능)
--> list의 각 element(value)를 predicate 함수를 돌려, 값이 truth인 것만 배열의 element로 리턴한다.

[예제]

  • [context]가 생략될 경우
<list가 배열일 경우>var evens = _.filter([1, 2, 3, 4, 5, 6], function(num){ return num % 2 == 0; });console.log(evens); // [2, 4, 6]// 배열 [1, 2, 3, 4, 5, 6]의 각 element가 test 함수의 num의 인자로 하나씩 들어가, 결과 값이 truth인 값만 모아 배열의 형태로 출력된다.<list가 객체일 경우>var obj = {"a": 1, "b": 2, "c": 3, "d":4}var evens = _.filter(obj, function(num){ return num % 2 == 0; });console.log( evens ); // [2, 4]// 객체 obj의 각 value가 test 함수의 num의 인자로 하나씩 들어가, 결과 값이 truth인 값만 모아 배열의 형태로 출력된다.
  • [context]가 입력될 경우
A = [5, 7, 10, 15];var divideBy5 = _.filter([0,1,2,3], function(item) { return this[item] % 5 == 0 ;}, A)console.log(divideBy5); // [0, 2, 3]// 배열 [0,1,2,3]의 각 element가 test 함수의 item의 인자로 하나씩 들어가, 결과 값이 truth인 값만 모아 배열로 출력되는데, 이때 [context]로 사용된 A는 test 함수안에 있는 this로 바인딩 되어 사용된다.

[구현]

_.filter() 함수를 직접 구현해보자.

<알고리즘>

  • 함수의 인자로 collection과 test를 가져온다.
  • 최종 리턴 값이 배열이기 때문에, 빈 배열을 선언한다.
  • _.each() 함수를 사용하여, 각 collection의 element(value)가 test 함수에서 truth인지 확인한다.
  • truth이면, 그 element(value)를 빈 배열에 추가한다.
  • 최종 배열을 리턴한다.
_.filter = function(collection, test) {var result = [];_.each(collection, function(elem) {if(test(elem)) {result.push(elem);}});return result;};

--

--