명령형에서 함수형으로 전환하기 - ChoDragon9/posts GitHub Wiki

const users = [
  { id: 1, name: 'ID', age: 36 },
  { id: 2, name: 'BJ', age: 32 },
  { id: 3, name: 'JM', age: 32 },
  { id: 4, name: 'PJ', age: 27 },
  { id: 5, name: 'HA', age: 25 },
  { id: 6, name: 'JE', age: 26 },
  { id: 7, name: 'JI', age: 31 },
  { id: 8, name: 'MP', age: 23 }
];

명령형 코드

// 1. 30세 이상인 users를 거른다.
const temp_users = [];
for (let i = 0; i < users.length; i++) {
  if (users[i].age >= 30) {
    temp_users.push(users[i]);
  }
}
console.log(temp_users);

// 2. 30세 이상인 users의 names를 수집한다.
const names = [];
for (let i = 0; i < temp_users.length; i++) {
  names.push(temp_users[i].name);
}
console.log(names);

// 3. 30세 미만인 users를 거른다.
const temp_users2 = [];
for (let i = 0; i < users.length; i++) {
  if (users[i].age < 30) {
    temp_users2.push(users[i]);
  }
}
console.log(temp_users2);

// 4. 30세 미만인 users의 ages를 수집한다.
const ages = [];
for (let i = 0; i < temp_users2.length; i++) {
  ages.push(temp_users2[i].age);
}
console.log(ages);

함수형 코드

// 1. 30세 이상인 users를 거른다.
const over_30 = users.filter(({age}) => age >= 30);
console.log(over_30);

// 2. 30세 이상인 users의 names를 수집한다.
const names = over_30.map(({name}) => name);
console.log(names);

// 3. 30세 미만인 users를 거른다.
const under_30 = users.filter(({age}) => age < 30);
console.log(under_30);

// 4. 30세 미만인 users의 ages를 수집한다.
const ages = under_30.map(({age}) => age)
console.log(ages);

응용형 함수는 인자로 받은 함수가 알고 있는 인자를 해당 함수에게 평가받아 로직을 완성해나가는 것을 말합니다. map, filter 와 같은 함수가 응용형 함수라고 합니다. 어떠한 데이터 형태인지 관심이 분리가 되고 다형성을 사용할 수 있기 때문에 재사용성이 높아집니다.

const filter = (collection, predicate) => {
  return Array.from(collection).filter(predicate);
};
const map = (collection, mapper) => {
  return Array.from(collection).map(mapper);
}

console.log(filter('123', (str) => Number(str) > 1));
console.log(filter([1,2,2], (str) => Number(str) > 1));