추출할 값을 반환하는 함수와 iterator로 새로운 배열을 만들어 반환한다.
const map = (f, iter) => { // iterator iter와 내부함수 f를 전달받는다.
const result = [];
for (const el of iter)
result.push(f(el));
return result; // FP는 side effect를 일으키지 않고 순수하게 결과값 그대로 반환한다.
}
기존의 map메서드는 Array.prototype에 정의가 되어 있기에 Array를 상속받지 않는 다른 iterable은 map메서드를 사용할 수 없다.
하지만 앞서 만든 map함수는 property에 해당 메서드가 존재하는지 유무 여부에서 자유롭다.
-> 모든 iterable을 인자로 받을 수 있기에 다형성 (여러가지 타입을 가질 수 있는 능력)에서 유리하다고 할 수 있다.
iterable을 순회하며 조건에 맞는 값을 내부함수로 판단해 새로운 배열에 포함해 반환한다
const filter = (f, iter) => {
let result = [];
for (const el of iter)
if (f(el)) result.push(el); /
return result;
}
iterable값을 하나의 값으로 축약한다.
const reduce = (f, acc, iter) => {
for (const el of iter)
acc = f(acc, el);
return acc;
}
reduce((a, b) => a + b, [1, 2, 3])
라면 acc가 1이 되고 iter는 [2, 3]이 된다.) 이를 구현하면 아래와 같은 코드가 된다.
const reduce = (f, acc, iter) => {
if (!iter) {
iter = acc[Symbol.iterator]();
acc = iter.next().value;
}
for (const el of iter)
acc = f(acc, el);
return acc;
}