map, values, pluck

devjune·2021년 10월 4일
0

ES5

목록 보기
9/14

이전에 만든 map 함수를 이용하여 반복이 가능한 자료들을 수집하는 기능에 좀 더 특화된 기능을 만들어 본다.

먼저 map 함수에 대해 복습하자면

var users = [
    { id: 10, name: 'ID', age: 36 },
    { id: 20, name: 'BJ', age: 32 },
    { id: 30, name: 'JM', age: 32 },
    { id: 40, name: 'PJ', age: 27 },
    { id: 50, name: 'HA', age: 25 },
    { id: 60, name: 'JE', age: 26 },
    { id: 70, name: 'JI', age: 31 },
    { id: 80, name: 'MP', age: 23 },
    { id: 90, name: 'FP', age: 13 }
];

function _curryr(fn) {
    return function(a, b) {
        return arguments.length == 2 ? fn(a, b) : function(b) { return fn(b, a); };
    }
}

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

var _length = _get('length');

function _each(list, iter) {
    var keys = _keys(list);
    for (var i = 0, len = keys.length; i < len; i++) {
        iter(list[keys[i]], keys[i]);
    }
    return list;
}

function _map(list, mapper) {
    var new_list = [];
    _each(list, function(val, key) {
        new_list.push(mapper(val, key));
    });
    return new_list;
}

function _is_object(obj) {
  return typeof obj == 'object' && !!obj;
}

function _keys(obj) {
  return _is_object(obj) ? Object.keys(obj) : [];
}

var _map = _curryr(_map);

console.log(
  _map( users, function(user) {
    return user.name;
  })
);

map함수는 컬렉션 객체의 특정 키의 값을 꺼내는 역할을 한다.

이 함수를 이용하여 values함수와 pluck함수를 만들 수 있다.

function _values(data) {
  return _map(data, function(val) { return val; });
}

console.log( users[0] );
console.log(_values(users[0]));
console.log(_keys(users[0]));

function _identity(val) {
  return val;
}

var a = 10;
console.log(_identity(a)); // 10

_identity()는 underscore.js에서도 사용되고 있는 함수다.
해당 함수는 map 함수의 보조 함수로 사용할 수 있다.

function _values(data) {
  return _map(data, _identity);
}

위 values함수를 더욱 간단하게 만들어 보자.

var _values = _map(_identity);

map 함수는 curryr함수를 통해 구현했기 때문에 map 함수는 함수를 리턴하는 함수인데, 이상황에서 identity함수를 인자로 주게 되면 identity함수를 실행하는 함수를 또 리턴하게 된다.

console.log( _map(_identity)(users[0]) );

즉 위 코드처럼 실행하게 된다면 curryr에 의하여 평가 순서가 뒤집히게 되고, 동일하게 실행되게 된다.

function _pluck() {};

_pluck(users, 'age');
// [33, 22, 11];

_pluck함수는 컬렉션 객체와, 키를 인자로 주게 되면 해당 키의 값을 리턴하는 함수이다.

function _pluck(data, key) {
  return _map(data, function(obj) {
    return obj[key];
  });
};

console.log( _pluck(users, 'age') );
console.log( _pluck(users, 'name') );
console.log( _pluck(users, 'id') );

만들어 놓은 get함수를 통해 간결하게 바꿔보자.

function _pluck(data, key) {
  return _map(data, _get(key));
};

이렇게 map함수를 통해 _values, _pluck 함수를 만들어 보았다.

profile
개발자준

0개의 댓글