값을 알아서 채워주는 배열을 만드는 방법에는 다음과 같은 것들이 있다.
fill(a)
함수는 배열을 a
라는 값으로 동일하게 채워준다. 다음과 같은 경우에 사용할 수 있다.
// 다리를 지나는 트럭
function solution(len, wei, trucks) {
const bridge = Array(len).fill(0);
let time = 0;
for (let on = 0; trucks.length; time++) {
on -= bridge.shift();
if (on + trucks[0] <= wei) {
on += trucks[0];
bridge.push(trucks.shift());
}
else bridge.push(0);
}
return time + bridge.length;
}
위의 코드는 큐(queue)를 사용하여 트럭이 다리를 지나는 시간을 구하는 문제다. 다리를 0
으로 채워진 큐로 만들기 위해 Array().fill()
을 사용했다. 이후 반복문들 돌며 push()
와 shift()
로 큐의 원소를 추가/삭제한다.
위의 식에 map()
을 사용하면 값을 바꿔줄 수 있다.
const arr = Array(5).fill().map((_, i) => i);
console.log(arr); // [0, 1, 2, 3, 4];
사이즈 5
의 배열에 fill()
을 하면 값이 undefined
로 초기화된다. 이후 map()
을 통해 인덱스를 값으로 채워주면 1씩 증가하는 배열을 얻을 수 있다. 이와 같은 역할을 하는 함수가 아래에 있다.
Array.from()
메서드에 대한 공식적인 설명은 다음과 같다.
Array.from()
메서드는 유사 배열 객체(array-like object)나 반복 가능한 객체(iterable object)를 얕게 복사해 새로운 Array 객체를 만듭니다.
메서드에서 사용되는 인자는 다음과 같다.
Array.from(arrayLike[, mapFn[, thisArg]])
- arrayLike: 배열로 변환하고자 하는 유사 배열 객체나 반복 가능한 객체.
- mapFn(Optional): 배열의 모든 요소에 대해 호출할 맵핑 함수.
- thisArg(Optional): mapFn 실행 시에 this로 사용할 값.
const arr = Array.from([1, 2, 3], x => x + x);
console.log(arr); // [2, 4, 6]
맵핑 함수의 첫 번째 인자는 배열 요소의 값이다. 위의 식은 유사 배열 객체의 값을 한 번 더한 값을 반환한다.
Array.from()
메서드를 사용해 위에서 Array().fill().map()
메서드로 만든 배열도 만들 수 있다.
const arr = Array.from({length: 5}, (_, i) => i);
console.log(arr); // [0, 1, 2, 3, 4];
유사 배열 객체의 length
속성으로 배열의 길이를 구한 다음, 인덱스를 사용해 1씩 증가하는 배열을 만드는 것이다. 뒤의 맵핑 함수를 바꿔서 다른 방식으로 증가하는 배열을 만들 수도 있다.