본문 바로가기

Study/VanillaJS

[개념잡기] 컬렉션 중심 프로그래밍 - (3) 찾아내기 (find, find_index, some, every)

[개념잡기] 컬렉션 중심 프로그래밍 - (3) 찾아내기 (find, find_index, some, every)

서론

이번 포스팅에서는 데이터에서 조건에 맞는 데이터를 찾아내는 것과 관련있는 함수들에 대해 알아보도록 하겠다.

컬렉션 중심 프로그래밍

find

  • 기대동작 : 조건에 맞는 데이터가 있다면 해당 데이터를 리턴
  • 코드 작성
var _find = _curryr((list, predi) => {
  var keys = _keys(list)
  for(var i = 0, len = keys.length ; i < len; i++) {
    var val = list[keys[i]]
    if(predi(val)) return val
  }
})

console.log(
  _find(users, function(user){
    return user.id == 3
  })
)
// {id: 3, name: "WE", age: 31}

each 함수를 참고하여 해당 predi 반환값이 참이라면 해당 값을 리턴하고 없다면 undefinded 를 리턴한다.

find_index

  • 기대동작 : 조건에 맞는 데이터가 있다면 해당 데이터의 인덱스를 리턴
  • 코드 작성
var _find_index = _curryr((list, predi) => {
  var keys = _keys(list)
  for(var i = 0, len = keys.length ; i < len; i++) {
    if(predi(list[keys[i]])) return i
  }
  return -1
})

console.log(
  _find_index(users, function(user){
    return user.id == 3
  })
)
// 2

find 함수와 비슷하게 작성하여 조건에 맞다면 해당 i 를 리턴하고 맞지 않다면 -1 을 리턴한다.

some

  • 기대동작 : 해당 리스트에 조건에 참으로 동작하는 것이 하나라도 있으면 true 반환
  • 코드 작성
var _some = (data, predi) => {
  return _find_index(data, predi) != -1
}

console.log(
  _some([2, 4, 6, 10], function(val){
    return val > 5
  })
)
// true

find_index 함수를 이용하여 반환 값이 -1과 비교하면 같지 않다면 true 를 반환한다.

  • 코드개선
var _some = (data, predi) => {
  return _find_index(data, predi || _identity) != -1
}

console.log(
  _some([true, false, false, false])
) // true

predi 함수가 없는 경우 identity 함수를 이용하여 자기 자신을 평가하게 해주었다.

every

  • 기대동작 : 해당 리스트의 모든 값이 참일 경우 true 반환
  • 코드 작성
var _every = (data, predi) => {
  return _find_index(data, _nagate(predi)) == -1
}

console.log(
  _every([2, 4, 6, 10], function(val){
    return val%2 == 0
  })
) // true

console.log(
  _every([2, 4, 6, 11], function(val){
    return val%2 == 0
  })
) // false

nagate 함수를 이용하여 함수를 반전시켰다. 예를 들어 조건이 1 이상이였고 리스트안에 숫자들이 [1,2,3,4] 라고 치면 nagate 함수로 인해 predi 함수는 1 이상이 아닌 값을 조건으로 걸게 되고 [1,2,3,4] 중에 조건에 맞는 값이 없으므로 -1 리턴하게 되고 따라서 every 함수는 참을 리턴하게 된다.

  • 코드 개선
var _every = (data, predi) => {
  return _find_index(data, _nagate(predi || _identity)) == -1
}

console.log(
  _every([true, true, true, false])
) // false

마찬가지로 identity 함수를 이용하여 다형성을 높여주었다.

마무리

오늘 작성한 함수

var _find = _curryr((list, predi) => {
  var keys = _keys(list)
  for(var i = 0, len = keys.length ; i < len; i++) {
    var val = list[keys[i]]
    if(predi(val)) return val
  }
})

var _find_index = _curryr((list, predi) => {
  var keys = _keys(list)
  for(var i = 0, len = keys.length ; i < len; i++) {
    if(predi(list[keys[i]])) return i
  }
  return -1
})

var _some = (data, predi) => {
  return _find_index(data, predi || _identity) != -1
}

var _every = (data, predi) => {
  return _find_index(data, _nagate(predi || _identity)) == -1
}