[개념잡기] 컬렉션 중심 프로그래밍 - (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
}
'Study > VanillaJS' 카테고리의 다른 글
[개념잡기] 컬렉션 중심 프로그래밍 - (5) 마무리 (0) | 2019.03.13 |
---|---|
[개념잡기] 컬렉션 중심 프로그래밍 - (4) 접기 (min_by, max_by, group_by, count_by) (0) | 2019.03.13 |
[개념잡기] 컬렉션 중심 프로그래밍 - (2) 거르기 (filter, reject, compact) (0) | 2019.03.11 |
[개념잡기] 컬렉션 중심 프로그래밍 - (1) 수집하기 (map, values, plunk) (0) | 2019.03.11 |
[개념잡기] 함수형 프로그래밍 - (9) 마무리 (0) | 2019.03.09 |