_get함수만들기 - part2

_get

이 함수는 object와 원하는 key를 인자로 받아서 object의 key로 접근하여
원하는 결과를 리턴합니다.

_get함수는 아래와 같습니다 .

1
2
3
function _get(obj, key){
return obj[key];
}

그런데 만약 obj가 null값이거나 undefinde라면 error가 발생할 것입니다.
_get에 아래와 같이 조건을 추가해서 문제를 해결할 수 있습니다.

1
2
3
function _get(obj, key){
return obj == null ? undefined : obj[key];
}

자, 만약 users라는 배열의 첫번째 객체의 ‘name’ 값을 얻고 싶다면 아래처럼 접근하면 되겠죠.

1
2
3
var user1 = users[0];
console.log(user1.name);
console.log(_get(user1,'name'));

만약, users에 없는 10번째 유저의 ‘name’값을 호출하게 된다면 error가 날것입니다.

하지만, _get함수를 사용하게 되면 오류가 나지 않고 undefined값을 내보낼 것이기 떄문에
에러가 나지 않습니다.

그래서 좀더 안전한 코딩을 할 수 있게 됩니다.


이번엔, _get을 만들때 이전 포스팅에서 학습했던 _curry를 이용해서

이전에 만들어 놓았던 코드를 더 간결하게 만들어보겠습니다.

먼저, _get함수를 아래와 같이 _curryr을 통해서 정의해 보겠습니다.

1
2
3
var _get = _curryr(function(obj, key){
return obj == null ? undefined : obj[key];
});

그럼 평가순서를 뒤집어서 인자 중에 맨 오른쪽(‘name’)부터 적용할 수 있습니다.

1
console.log(_get('name')(user1));

이런식으로, name을 먼저꺼내고, 그 다음 user1을 꺼낼 수 있습니다.

즉, _get(‘name’) 이것 자체가 name을 꺼내는 함수가 됩니다.

1
var get_name = _get('name');

get_name 이라는 함수객체를 생성할 수 있겠네요.

만약, get_name이라는 함수에 user1을 넣으면 name값을 확인해 볼 수 있습니다.

기존에 만들었던 코드를 불러와 _get함수를 적용해 보겠습니다.

1
2
3
4
5
6
7
8
9
console.log(
_map(
_filter(users, function(user){return user.age >= 30;}),
function(user){return user.name;}));

console.log(
_map(
_filter(users, function(user){return user.age < 30;}),
function(user){return user.age;}));

위의 코드에서 function(user){return user.name;} 이부분을
_get(‘name’)으로 바꿔주기만 하면 됩니다.

그럼, 아래처럼 훨씬 간결하게 코드를 짤 수 있습니다.

1
2
3
4
5
console.log(
_map(_filter(users, function(user){return user.age >= 30;}), _get('name')));

console.log(
_map(_filter(users, function(user){return user.age < 30;}), _get('age')));

간단하게 커링에 이어서 get함수에 대해서 공부해보았는데요.
지금까지 배운 강의중에 제일 이해하기 어려웠던 부분이었던 것 같네요..

하지만, 이정도로 포기하지 않습니다^^하하

다음 강의는 reduce라는 함수에 대한 것이네요. 화이팅입니다 !!

Share