find
filter와 유사하나 predi에 걸러진 처음으로 만나는 요소를 반환한다.
/*찾아내기 대표 함수 find
filter와 유사하나 predi에 걸러진 처음으로 만나는 요소를 반환한다.*/
function find(list, predi){
const _keys = keys(list);
for(let i=0;i<_keys.length;i++){
const val = list[_keys[i]];
if(predi(val)) return val;
}
return undefined; //생략 가능, 자동으로 undefined 리턴될 것
}
console.log(
_.find(users, user => user.age >= 30),
_.filter(users, user => user.age >= 30),
);
find_index
predi에 걸러진 처음으로 만나는 요소의 인덱스를 리턴한다.
/*predi에 걸러진 처음으로 만나는 요소의 인덱스를 리턴한다.*/
function find_index(list, predi){
const _keys = keys(list);
for(let i=0;i<_keys.length;i++){
if(predi(list[_keys[i]])) return _keys[i];
}
return -1; //자바스크립트 표준에 맞춤
}
console.log(
_.find_index(users, user => user.age <= 25),
_.find_index(users, user => user.age > 40),
);
주의사항
설명으로 처음으로 만나는 요소라고 했는데, 이것이 순차 탐색을 의미하는 것이 아니다.
언어를 넘어서 함수형을 부수효과를 제거하고, 항상 새로운 값을 만들어 리턴한다. 이러한 점은 병렬 처리에 강점이된다. 따라서 대부분의 언어에서 멀티 쓰레드로 처리할 수도 있다. 이 경우 가장 처음 조우하는 값을 리턴하게 된다.
some
주어진 조건에 값이 하나라도 존재하는지 검사한다.
/* find_index 특화 함수 주어진 조건에 값이 하나라도 존재하는지 검사한다. */
function some(list, predi){
//하나라도 해당하면 -1을 리턴할 수 없다.
return find_index(list, predi) !== -1;
}
every
주어진 조건에 값이 전부 일치하는지 검사한다.
/* find_index 특화 함수 주어진 조건에 값이 전부 일치하는지 검사한다.*/
function every(list, predi){
//주어진 조건 반대에 해당하는 값을 못찾으면, 전부 해당하는 것
return find_index(list, negate(predi)) === -1;
}
function every2(list, predi){
return find_index(list, function(val){
return !predi(val);
})
}
function every3(list, predi){
return find_index(list, (val)=> !predi(val) )
}
전부 일치를 확인하려면, 전제 조건이 모든 요소를 전부 순회해야한다.
따라서 find_index가 -1을 리턴하도록 유도한다. 그리고 나서 주어진 조건식을 활용할 방법을 생각하면, every 동작 방식이 쉽게 이해된다.
함수를 사용해 조건식 결과를 반대로 만들면 된다. 이때 이미 만들어둔 negate를 사용했다.
console.log(
_.some(users, user=>user.age>30),
_.every(users, user=>user.age>30),
_.every(users, user=>user.age>10),
)
더 다듬기
조건식이 주어지지 않을때 기본적으로 동작할 방식을 지정해준다.
이에 identity 함수를 사용했다.
/* find_index 특화 함수 주어진 조건에 값이 하나라도 존재하는지 검사한다.*/
function some(list, predi){
//하나라도 해당하면 -1을 리턴할 수 없다.
return find_index(list, predi||identity) !== -1;
}
/* find_index 특화 함수 주어진 조건에 값이 전부 일치하는지 검사한다.*/
function every(list, predi){
//주어진 조건 반대에 해당하는 값을 못찾으면, 전부 해당하는 것
return find_index(list, negate(predi||identity)) === -1;
}
아무런 의미도 없을 것 같던 identity 함수가 요긴하게 쓰인다.
console.log(
_.some(users),
_.every(users),
_.some(testArr),
_.every(testArr),
)
contains
주어진 값이 존재하는지 검사하는 함수
/*주어진 값이 존재하는지 검사하는 함수*/
function contains(list, data){
return find_index(list, val => val === data) !== -1;
}
console.log(
_.contains(users, users[2] ),
_.contains(users[2], "JM" ),
_.contains(users[2], "홍길동" ),
)
'개발 > 함수형 프로그래밍' 카테고리의 다른 글
11 - each, map 개선, 마무리 (0) | 2023.06.20 |
---|---|
10 - 컬렉션 중심 프로그래밍 - reduce(접기) (0) | 2023.06.19 |
08 - 컬렉션 중심 프로그래밍 - filter(거르기) (0) | 2023.06.18 |
07 - 컬렉션 중심 프로그래밍 - map (수집하기) (0) | 2023.06.17 |
06 - 다형성 높이기 (0) | 2023.06.16 |