Inside Lodash: _.concat

 

_.concat(array, [values])

 

여러 배열들을 순서대로 하나의 배열로 이어 붙여주는 함수입니다. 이 함수의 인자로는 배열도 가능하지만 단일 값을 가진 일반 변수도 가능합니다.

이 함수를 실행하면 새로운 배열을 반환하므로 원본 배열에는 아무런 수정도 가해지지 않는다는 것이 특징입니다만,  값을 복사하는 방식이 shallow copy 이므로 오브젝트를 바라보는 변수가 복사되면 오브젝트가 새로 만들어지지 않고 기존의 오브젝트를 그대로 가리키는 새로운 변수가 만들어집니다.


var new_array = old_array.concat(value1[, value2[, ...[, valueN]]])

 

참고로 자바스크립트 언어에도 위의 명세와 같이 동일한 기능을 하는 함수가 존재합니다.

 


function concat() {
    var length = arguments.length;
    if (!length) {
        return [];
    }
    var args = Array(length - 1),
               array = arguments[0],
               index = length;

    while (index--) {
        args[index - 1] = arguments[index];
    }
    return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));
}

 

가변 인자를 받아야 하기 때문에 arguments 객체를 이용하고 있습니다. arguments 객체를 이처럼 활용하면 정해지지 않은 다수의 인자를 받는 처리가 가능한데, 따로 지정된 변수명이 없기 때문에 arguments 객체를 배열처럼 활용하게 됩니다. 하지만 실제로 이 객체는 배열이 아닙니다. 배열로 활요하고 싶다면 다음 한 줄을 추가해주어야 합니다.

 


var args = Array.prototype.slice.call(arguments);

 

함수 마지막 줄에 핵심 구현부가 포함되어 있습니다. 첫 번째 인자로 넘어온 array(혹은 단일 변수를 배열화 시킨)에 뒤이어 들어온 인자들을 push 하고 있습니다. 이 때, 뒤이어 들어온 여러 인자들을 배열의 깊이(depth)를 한 단계 감소시켜주는데 _.flatten에 사용되는 baseFlatten 함수를 이용하고 있습니다.

 


var array = [1];
var other = _.concat(array, 2, [3], [[4]]);
console.log(other);
// => [1, 2, 3, [4]]

 

arrayPush([1], [2, 3, [4]])가 되는셈이죠.

 

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