1. pipe
- 입력되는 함수가 많다. 이 함수들을 입력받아서 차례대로 결합된 함수를 다시 리턴해야 한다.
- 각 함수는 number를 입력받아서 number을 다시 리턴한다.
- 함수는 1개 이상이고, 함수가 아닌 입력은 없다.
function pipe(...funcs) { // 입력되는 함수의 수가 많다고 하였을떄, 모두를 가져오기 위해 spread를 사용 한다.
return function sum(num) { // 다시 함수를 리턴해야 하니 함수를 선언하고 인자를 num으로 받는다.
let result = num; // 이때, 받는 인자를 result 에 할당하고
for(let func of funcs) { // 반복문과 of 를 통해 모든 함수를 돌면서
result = func(result); // 모든 함수들에 인자를 넣어 처리해 준다.
} return result; // 모든 처리가 끝난 결과를 리턴한다.
}
}
- spread로 함수를 가져와서 각각의 함수에 모두 같은 인자를 주기 위해 for of를 쓸 수 있는 것이 포인트이다.
- 조금 더 데이터들을 가져올 때를 주의해서 생각해야 한다.
2. getIndex
- 인자로 넘버 타입을 가진 arr와 num를 받아, arr에 num를 추가하고, 이를 순서대로 정렬해서 추가한 num의 인덱스를 리턴해야 한다.
- 반복문과 sort와 indexOf는 사용금지이다.
// 첫번째 시도 => reduce 를 이용해 정렬해서 num의 인덱스를 리턴한다.
function getIndex(arr, num) {
arr.push(num); // arr에 num를 넣는다.
arr.reduce((acc, cur) => {
if(Number(cur) > Number(acc)) { // cur과 acc를 비교해서
arr.push(cur) // 보다 크면 뒤로 붙이고
} else {
arr.unshift(cur) // 작거나 같으면 앞으로 붙인다.
}
})
return arr.indexOf(num) // index를 리턴.
}
- 물론 처참히 실패.
- 먼저 indexOf를 사용했기 때문에 실패이다.
- 그리고 나오는 값은 reduce 함수를 실행될 때 첫 번째 요소가 각 요소들과 전부 비교하게 된다. 그래서 배열이 엄청 늘어난다.
- reduce로는 해결하기 복잡할 것 같아서 map으로 배열을 정렬할 수는 없을까?라는 생각을 하였다.
- 하지만 다른 방법으로는 배열을 정렬시킬 수는 없을 것 같아서 생각을 바꿔보았다.
- num 가 배열에 들어가는 것이 아니라, arr 안의 모든 수들을 num와 비교하여,
arr의 요소 중에 num 보다 작은 수가 있을 때마다 count를 올리면 index와 같다고 생각했다.
function getIndex(arr, num) {
let count = 0; // index 를 계산 해 줄 count를 선언하고 0을 할당한다.
arr.push(num); // 먼저 arr에 num를 넣는다.
arr.filter((arr) => { // filter 로 arr의 요소들을 하나하나 비교 한다.
if(arr < num) { // num 보다 작다면
count++ // count를 올린다.
}
})
return count; // count는 num 의 인덱스와 같으니 리턴한다.
}
- 해결!
- 꼭 map이나 filter, reduce로 배열을 바꿔서 조작하는 것이 아닌, 데이터를 가공해서 필요한 정보만을 가지고 올 수 있어야 한다.