본문 바로가기

Study/VanillaJS

[개념잡기] 컬렉션 중심 프로그래밍 - (2) 거르기 (filter, reject, compact)

[개념잡기] 컬렉션 중심 프로그래밍 - (2) 거르기 (filter, reject, compact)

서론

컬렉션 중심 프로그래밍의 두번째 거르기에 대해 알아보도록 하겠다.
수집하기의 기본이 되는 함수는 filter 함수이다.

var _filter = _curryr((list, predi) => {
  var new_list = []
  _each(list, (val) => {
    if(predi(val)) {
      new_list.push(val)
    }
  })
  return new_list
})

console.log(
  _filter(users, function(user) {
    return user.age > 30
  })
)

컬렉션 중심 프로그래밍

reject

  • 기대동작 : filter 함수의 반대 동작으로 조건에 맞지 않는 값들을 리스트로 리턴
  • 코드 작성
//reject
var _reject = (data, predi) => {
  return _filter(data, function(val) {
    return !predi(val)
  })
}

filter 함수의 predi 함수의 값을 반전해서 코드를 작성하였다.

  • 코드 개선
var _reject = (data, predi) => {
  return _filter(data, _nagate(predi))
}

var _nagate = (func) => {
  return function(val) {
    return !func(val)
  }
}

console.log(
  _reject(users, function(user) {
    return user.age > 30
  })
)

// 0: {id: 1, name: "ID", age: 29}
// 1: {id: 2, name: "QW", age: 30}
// 2: {id: 5, name: "RT", age: 21}
// 3: {id: 6, name: "DF", age: 28}
// 4: {id: 8, name: "IS", age: 25}

반전된 함수를 리턴하는 nagate 함수를 이용하여 코드 개선을 해보았다.

compact

  • 기대동작 : 인자로 받은 리스트에서 참값만 걸러 리스트 반환
  • 코드 작성
var _compact = _filter(_identity)

console.log(
  _compact([0, 1, 2, null, {}, false, true])
)
// (4) [1, 2, {…}, true]

전에 만들었던 identity 함수를 이용하여 넘겨 받은 값을 그대로 predi 함수에 넣어 false, 0, null 등은 if 문에서 걸러지게 하였다.

마무리

오늘 작성한 함수

// reject
var _reject = (data, predi) => {
  return _filter(data, _nagate(predi))
}

// nagate
var _nagate = (func) => {
  return function(val) {
    return !func(val)
  }
}

// compact
var _compact = _filter(_identity)