node.js 유용한 모듈 (5) – hashish

오늘은 node.js modules you should know about 연재의 다섯번째 시간이다.

첫 번째 연재에서는 node.js용 RPC 라이브러리인 dnode에 대해 다뤘고, 두 번째는 간결한 node용 옵션 파서 모듈인 optimist에 대해 살펴봤다. 그리고 세번째 연재는 node용 lazy 리스트 모듈인 lazy를 알아봤고, 마지막으로 HTTP 스트림 처리를 위한 만능 도구인 request 모듈에 대해서 살펴봤다.

이번 연재에서 소개할 모듈은 hashish이다. hashish는 Browserling and Testling의 공동 창업자인 James Halliday이 작성했다. 여러분은 왜 내가 그가 작성한 여러 모듈들을 연재 기사에서 다루는지 궁금한 것이다. 그것은 그가 88개의 node 모듈을 작성했으며, 그들중의 몇몇은 아주 훌륭한 기능을 가지고 있기 때문이다.

hashish는 자바스크립트의 해시 처리 라이브러리로, 해시 자료구조를 다루는 다양한 함수들이 포함되어 있다.

다음 예제를 살펴보자.

var Hash = require('hashish');

Hash({ a : 1, b : 2, c : 3, d : 4 })
    .map(function (x) { return x * 10 })
    .filter(function (x) { return x < 30 })
    .forEach(function (x, key) {
        console.log(key + ' => ' + x);
    })
;

위 코드에서 Hash 객체는 해시 { a : 1, b : 2, c : 3, d : 4 }로 부터 생성된다. 다음으로 각 해시 값에 10을 곱하는 함수가 map 된다. 그런 다음 해시 값이 30 보다 작은 해시 요소들을 필터링 하는filter함수가 적용된다. 이제 Hash 객체는 { a : 10, b : 20 }와 같다. 마지막으로 forEach 함수가 남아있는 해시 객체의 (키, 값) 쌍을 출력하게 되는 데, 위 코드의 결과는 다음과 같다.

a => 10
b => 20

해시 조작을 위한 함수들이 내가 이전 연재에서 작성한 node-lazy 모듈과 유사하다는 것을 기억해라. 모든 조작 메서드들은 체이닝이 가능하기 때문에 여러분의 코드는 깔끔하게 유지될 수 있다.

만약 함수들의 체이닝을 원치 않는다면, hashish는 아래 예제와 같이 각 함수가 체이닝이 아닌 형태로 Hash 객체를 처리가 가능하게 해준다.

var Hash = require('hashish');
var obj = { a : 1, b : 2, c : 3, d : 4 };

var mapped = Hash.map(obj, function (x) {
    return x * 10
});

console.dir(mapped);

위 코드에서 obj 해시에 Hash.map 함수가 어떻게 호출됐는지를 기억하자. 결과는 각 해시 값에 10을 곱한 값이 된다.

{ a: 10, b: 20, c: 30, d: 40 }

hashish는 또한 체이닝이나 Hash.xxx 형태의 함수에서 사용가능한 다양한 속성들을 제공한다. 예를 들면:

$ node
> var Hash = require('hashish');
> var obj = { a : 1, b : 2, c : 3, d : 4 };
>
> Hash(obj).keys
[ 'a', 'b', 'c', 'd' ]
> Hash(obj).values
[ 1, 2, 3, 4 ]
> Hash(obj).length
4

npm을 통해 hashish를 설치할 수 있다.

npm install hashish

Enjoy!

If you love these articles, subscribe to my blog for more, follow me on Twitter to find about my adventures, and watch me produce code on GitHub!

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.

다음의 HTML 태그와 속성을 사용할 수 있습니다: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>