Language/JavaScript

[JavaScript] Array.from() - 유사 배열을 가지고 새로운 배열 만들기

썸머워즈 2022. 7. 26. 10:33
반응형

Array.from() 메서드는 제목 그대로 유사 배열 객체(array-like object)나 반복 가능한 객체(iterable object)를 얕게 복사해 새로운 Array 객체를 만들어주는 메서드이다.

 

▷ 구문

Array.from(arrayLike[, mapFn[, thisArg]])

arrayLike: 배열로 변환하고자 하는 유사 배열 객체나 반복 가능한 객체.

mapFn: 배열의 모든 요소에 대해 호출할 맵핑 함수 (배열의 map 메서드와 동일하다 생각하면 된다.)

thisArg: mapFn 실행 시에 this로 사용할 값


유사 배열이란 length 속성과 인덱싱 된 요소를 가진 객체를 의미하며, 반복 가능한 객체는 Map, Set 등 객체의 요소를 얻을 수 있는 객체를 의미한다. (Set을 Array.from을 통해 배열로 바꾸는 예제를 많이 봐왔을 것이다.)

 

예제를 통해 알아보자.


▷ 예제1) Array.from() 메서드 기본 사용법

// String
Array.from('foo'); // ["f", "o", "o"]

// Set
const s = new Set(['foo', window]);
Array.from(s); // ["foo", window]

// Map
const m = new Map([[1, 2], [2, 4], [4, 8]]);
Array.from(m); // [[1, 2], [2, 4], [4, 8]]

const mapper = new Map([['1', 'a'], ['2', 'b']]);
Array.from(mapper.values()); // ['a', 'b'];

Array.from(mapper.keys()); // ['1', '2'];

 

▷ 예제2) Array.from()과 mapFn 사용하기

// Using an arrow function as the map function to
// manipulate the elements
Array.from([1, 2, 3], x => x + x);
// [2, 4, 6]

// Generate a sequence of numbers
// Since the array is initialized with `undefined` on each position,
// the value of `v` below will be `undefined`
Array.from({length: 5}, (v, i) => i);
// [0, 1, 2, 3, 4]

아까 위에서 설명한 것처럼 Array.from() 메서드 안에서 사용하는 mapFn은 Array.prototype.map() 메서드와 동일하다고 생각하면 된다.

 

그래서 위 예제를 보면 Array.from([1, 2, 3], x => x + x) Array.from([1, 2,3]).map(v => v + v)와 동일하다.

그렇다 보니 당연히 value 뿐만 아니라 index마저 사용이 가능하다.

 

그리고 두 번째 예제를 보면 {length: 5}라는 생소한 것을 넣어서 사용하고 있는데,

위에서 설명할 때 "유사 배열이란 length 속성과 인덱싱 된 요소를 가진 객체를 의미"라고 설명한 바 있다.

그래서 length 속성을 가진 객체를 넣어주게 되면 value가 undefined이며, 길이가 5인 유사 배열이 탄생한다.

 

length라는 속성을 굳이 사용하고 싶지 않다면 Array(5)와 동일하게 작동을 하니 Array(n)을 사용해주면 된다.


참고: https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/from

 

Array.from() - JavaScript | MDN

Array.from() 메서드는 유사 배열 객체(array-like object)나 반복 가능한 객체(iterable object)를 얕게 복사해 새로운Array 객체를 만듭니다.

developer.mozilla.org

반응형