Skip to content

하조은의 블로그

오늘의 함수 - pluck

JavaScript, 오늘의 함수, 함수형 프로그래밍1 min read

오늘 발견한 재미있는 함수를 소개합니다

pluck

Pluck는 '뽑다'는 의미를 가지고 있습니다. 풀을 뽑을 때 'pluck grass'라고 합니다. '잡아 뜯다'는 느낌이 강합니다. 오늘 소개할 함수 pluck도 배열 속 객체에서 원하는 값만 잡아 뜯는(뽑는) 함수입니다. 배열이라는 땅에 자란 객체라는 풀 중에 뽑아야할 풀(객체)만 뽑아내는 함수라고 생각하시면 편하겠습니다. 뽑아낸 결과가 다시 땅(배열)이라는게 좀 이상하긴 하네요.

예제를 살펴보겠습니다.

(1) 어제의 함수

1let queen_family = [
2 { name: 'Oliver Queen', status: 'alive'},
3 { name: 'Robert Queen', status: 'deceased' },
4 { name: 'Moria Queen', status: 'deceased' },
5 { name: 'Thea Queen', status: 'alive' }
6];

지난 시간에 다뤘던 데이터에서 일부를 가져왔습니다. 가족 구성원의 정보(객체)가 담긴 배열입니다. 우리가 원하는건 가족 구성원의 이름이라고 가정하겠습니다. 가족 모두의 이름을 찾아 배열로 만드는 일은 간단합니다. map 함수를 사용하면 됩니다.

1let names = map(queen_family, person => person.name);
2// queen_family.map(person => person.name)
3
4console.log(names); // ["Oliver Queen", "Robert Queen", "Moria Queen", "Thea Queen"]

map을 사용하니 원하는 값을 쉽게 배열로 만들어주네요. 그런데 여기서 낯익은 구문이 나옵니다. 바로 person => person.name 이 함수입니다. 지난 시간에 다룬 val 함수를 사용할 수 있을 것 같습니다.

1let names = map(queen_family, val('name'));
2
3console.log(names); // ["Oliver Queen", "Robert Queen", "Moria Queen", "Thea Queen"]

오늘의 함수인 pluckmapval함수가 함께 하는 일을 혼자서 해냅니다.

(2) 오늘의 함수

1let names = pluck(queen_family, 'name');
2
3console.log(names); // ["Oliver Queen", "Robert Queen", "Moria Queen", "Thea Queen"]

훨씬 깔끔하네요. 그렇다면 pluck는 어떻게 구현할까요?

1const pluck = (arr, key) => map(arr, val(key));

장난인 듯 장난 아닌 멋진 구현입니다. 결국 pluck는 두 함수의 조합(합성)으로 만들 수 있는 함수입니다. 근사하지 않나요?

© 2022 by 하조은의 블로그. All rights reserved.
Theme by LekoArts