자바스크립트 유틸리티 라이브러리로 underscore를 사용하다가 요즘은 거의 lodash로 옮겼다. 체감하지는 못하지만 성능이 좋다고 한다. 내가 살펴보는 대부분의 오픈소스도 undersocre에서 lodash로 옮기고 있는 분위기다. lodash 사용기를 정리해 보자. 뭐 underscore와 별 차이가 없을지도 모르겠다.

_.fill()

특정한 값으로 배열을 채울 때 사용한다.

_.fill(Array(3), true)
// [true, true, true]

_.pluck()

객체로 구성된 배열에서 객체의 특정 키에대한 값을 추출할 때 사용한다.

var users = [{
  id: 1,
  name: 'Chris'
}, {
  id: 2,
  name: 'Mike'
}, {
  id: 3,
  name: 'Sam'
}];

_.pluck(users, 'id');
// [1, 2, 3]

_.every()

배열을 순회하면서 각 요소에 대한 검증함수를 수행한다. 그리고 모든 결과가 true를 반환할 때 동작하는 함수이다. 이걸 어디다 사용할까 했었는데 유닛 테스트에서 사용하게 되었다.

it('should filtered by gift id', function (done) {
  request(app)
      .get('/api/giftTakings?GiftId=1')
      .end(function (err, res) {
        if (err) throw err;

        _.every(res.body, function (giftTaking) {
          return giftTaking.GiftId === 1;
        }).should.be.true;
        done();
      });
    });

_.omit() 와 _.remove()

포함된 아이템을 삭제한다는 점에서는 비슷한 역할을 하는 함수지만 용도가 다르다. _.omit()은 객체를 대상으로 하여 특정 키나 값을 제거하는 함수다. 그 결과 기존 객체에서 새로운 객체를 생성하여 반환한다. REST API에서 리소스 모델을 json으로 받아서 처리할 때 사용했다.

function update(req, res) {
  var value = _.omit(req.body, _.isUndefined);
  if (_.isEmpty(value)) {
    return res.status(400).json({error: 'parameter is empty'});
  }

  // value 객체를 이용하여 모델 업데이트
  // ...
}

_.remove()는 배열을 대상으로 그 삭제 기능을 하고 결과 삭제된 아이템을 배열로 반환한다. 말이 좀 애매한데 예제를 보면 쉽게 이해할 수 있다. (아래 코드는 lodash 문서 예제와 동일하다)

var array = [1, 2, 3, 4];
var evens = _.remove(array, function(n) {
  return n % 2 == 0;
});

console.log(array);
// → [1, 3]

console.log(evens);
// → [2, 4]

_.toArray()

그동안 toArray() 를 잘못사용하고 있었다. 문자열을 파싱해서 배열로 변환할 것이다. 구분자는 디폴트로 쉼표로 인식하여 처리할 것이다. 이런 생각으로 아래와 같이 코딩했었다.

function update(req, res) {
   var ids = _.toArray(req.params.id) // req.params.id = '1,2,3';
   // ids = ['1', '2', '3'] 이렇게 나올줄 알았다.
   // 그러나
   // ids = [ '1', ',', '2', ',', '3' ] 이렇게 나온다.
}

문서를 확인해 보니 잘못되도 한참 잘못됐다. toArray() 함수는 기본적으로 객체의 밸류를 배열로 반환하는 함수이며 문자열을 받을 경우는 각 한 글자씩 쪼개서 배열로 반환한다. id를 쉼표로 구분한 문자열로 받을 때 이것을 배열로 처리하려면 toArray() 함수는 적당하지 않다.