Array map, filter, values 분석
아래 데이터로 php 와 js 의 다른 점을 확인해보자.
id 가 3 이상인 id 만 추출하고 싶었다.
users.json1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| [ { "id": 1, "name": "Leanne Graham", "username": "Bret", "email": "Sincere@april.biz" }, { "id": 2, "name": "Ervin Howell", "username": "Antonette", "email": "Shanna@melissa.tv" }, { "id": 3, "name": "Clementine Bauch", "username": "Samantha", "email": "Nathan@yesenia.net" }, { "id": 4, "name": "Patricia Lebsack", "username": "Karianne", "email": "Julianne.OConner@kory.org" }, { "id": 5, "name": "Chelsey Dietrich", "username": "Kamren", "email": "Lucio_Hettinger@annie.ca" } ]
|
AS-IS
JS
머리 속으로 돌려본 원래 느낌은 이랬다.
1 2 3 4 5 6 7 8 9 10 11
| let userIdxs = users.map((user) => { if (user.id >= 3) { return user; } });
userIdxs = userIdxs.filter(Boolean);
|
php
생각 없이 짜면 array_map
을 먼저 사용할 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| $userIdxs = array_map(function ($user) { if ($user['id'] >= 3) { return $user['id']; } }, $users);
$userIdxs = array_filter($userIdxs);
$userIdxs = array_values($userIdxs);
|
array_values(array_filter(array_map()))
과 같이 호출할 수 있긴 하다.
너무 지저분했다.
TO-BE
조금만 생각해도 FP 의 개념에 어긋남을 느낄 수 있다.
범위를 줄이고 나서 해당 값을 추출하는 게 맞다.
JS2
1 2 3
| const userIdxs = users.filter((user) => user.id >= 3).map((user) => user.id);
|
php2
array_values
를 쓰지 않고도 깔끔한 코딩이 가능하다.
1 2 3 4 5 6 7 8 9
| $userIdxs = array_filter($users, function ($user) { return $user['id'] >= 3; });
$userIdxs = array_map(function ($user) { return $user['id']; }, $userIdxs);
|
lara
물론 더 멋진 방법이 있다.
1 2 3 4 5 6 7 8 9 10
| $userIdxs = collect($users) ->filter(function ($user) { return $user['id'] >= 3; }) ->map(function ($user) { return $user['id']; }) ->all();
|
여담
php, js, java, python 을 넘나들다보니 사용하는 언어의 흐름에 대한 개념이 1/n 로 줄어드는 것 같다.