Inside Lodash: _.compact

 

_.compact(array)

 

배열에 false로 인식 되는 모든 요소들을 깔끔하게 지운 새로운 배열을 반환해줍니다. 여기서 false로 인식되는 것들은 다음 값들입니다:

  • false
  • null
  • 0
  • “”
  • undefined
  • NaN

 


function compact(array) {
    var index = -1,
        length = array ? array.length : 0,
        resIndex = 0,
        result = [];

    while (++index < length) {
        var value = array[index];
        if (value) {
            result[resIndex++] = value;
        }
    }
    return result;
}

 

구현부를 살펴보면 false로 판정을 내리는데 자바스크립트 언어의 if절이 그대로 사용되고 있는 것을 알 수 있습니다.

재미있는 점은 resIndex라는 정수형 변수를 이용하여 직접 배열의 위치를 지정하여 값을 할당하고 있습니다. 자바스크립트에는 배열에 요소를 추가하는 push라는 간편한 함수가 제공되는데 왜 이렇게 구현하였을까요?

이 주제에 대해 많은 사람들이 논의를 한 흔적을 찾아 볼 수 있었습니다.

Is there a reason JavaScript developers don’t use Array.push()?
Why is array.push sometimes faster than array[n] = value?

결국 종합해보면 자바스크립트 언어의 array는 기존 언어들처럼 순차적인 메모리 번지를 가지는 것이 아니라 key/value 쌍으로 이루어진 map 형태이므로 direct assignment가 크게 유리하지 않는 것으로 보입니다.

실제로 위 코드의 배열에 대입하는 구문을 push로 바꾸어 테스트 해본 결과, 10번 시도의 평균값으로 direct assignment가 2.22ms, push가 1.99ms로 근소하게 push 방식이 빠르게 나타났습니다.

 

Lodash 4.16.2

 

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s