자바스크립트 유틸리티 라이브러리로 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() 함수는 적당하지 않다.