배열이란?
const arr = ["apple", "banana", "orange"];
arr[0] // apple
arr[1] // banana
arr[2] // orange
arr.length // 3
for (let i = 0; i < arr.length; i++){
console.log(arr[i]);
}
자바스크립트의 배열 특징
| 구분 | 객체 | 배열 |
|---|---|---|
| 구조 | 프로퍼티 키와 프로퍼티 값 | 인덱스와 요소 |
| 값의 참조 | 프로퍼티 키 | 인덱스 |
| 값의 순서 | ✕ | ○ |
| Length 프로퍼티 | ✕ | ○ |
console.log(Object.getOwnPropertyDesciptors([1, 2, 3]));
/*
{
'0': {value: 1, writable: true, enumerable: true, configurable: true}
'1': {value: 2, writable: true, enumerable: true, configurable: true}
'2': {value: 3, writable: true, enumerable: true, configurable: true}
length: {value: 13 writable: true, enumerable: false, configurable: false}
}
*/
const arr = [
"string",
10,
true,
null,
undefined,
NaN,
Infinity,
[],
{},
function () {},
];
const arr = [1, 2, 3, 4, 5];
// 현재 length 프로퍼티 값보다 작은 숫자 값을 할당하면 배열의 길이가 줄어든다.
arr.length = 3;
// 배열의 길이가 5에서 3으로 줄어든다.
console.log(arr); // [1, 2, 3]
const arr = [1];
// 현재 length 프로퍼티 값인 1보다 큰 숫자 값 3을 length 프로퍼티에 할당
arr.length = 3;
// length 프로퍼티 값은 변경되지만 실제로 배열의 길이가 늘어나지는 않는다.
console.log(arr.length); // 3
console.log(arr); // [1, empty * 2]
console.log(Object.getOwnPropertyDesciptors(arr));
/*
{
'0': {value: 1, writable: true, enumerable: true, configurable: true}
length: {value: 3 writable: true, enumerable: false, configurable: false}
}
*/
const arr = [];
console.time("Array Performance Test");
for (let i = 0; i < 10000000; i++) {
arr[i] = i;
}
console.timeEnd("Array Performance Test");
// 약 340ms
const obj = {};
console.time("Object Performance Test");
for (let i = 0; i < 10000000; i++) {
obj[i] = i;
}
console.timeEnd("Object Performance Test");
// 약 600ms
배열 생성
const arr = [1,2,3];
console.log(arr.length); // 3
const arr = [];
console.log(arr.length); // 0
const arr = new Array(10);
console.log(arr); // [empty * 10]
console.log(arr.length) // 10
// 전달된 인수가 2개 이상이면 인수를 요소로 갖는 배열을 생성한다.
new Array(1, 2, 3); // [1, 2, 3]
// 전달된 인수가 1개지만 숫자가 아니면 인수를 요소로 갖는 배열을 생성한다.
new Array({}); // [{}]
Array(1, 2, 3); // [1, 2, 3]
// 인수가 없을 때는 빈배열을 생성한다.
Array.of(); // []
// 전달된 인수가 1개이고 숫자이더라도 인수를 요소로 갖는 배열을 생성한다.
Array.of(1); // [1]
Array.of(1, 2, 3); // [1, 2, 3]
Array.of("string"); // ['string']
// 유사 배열 객체를 변환하여 배열을 생성한다.
Array.from({ length: 2, 0: "a", 1: "b" }); // ['a', 'b']
// 이터러블을 변환하여 배열을 생성한다. 문자열은 이터러블이다.
Arrray.from("Hello"); // ['H', 'e', 'l', 'l', 'o']
// Array.from에 length만 존재하는 유사 배열 객체를 전달하며 undefined를 요소로 채운다.
Array.from({ length: 3 }); // [undefined, undefined, undefined]
// Array.from은 두 번째 인수로 전달한 콜백 함수의 반환값으로 구성된 배열을 반환한다.
Array.from({ length: 3 }, (_, i) => i); // [0, 1, 2]
const arrayLike = {
'0': "apple",
'1': "banana",
'2': "orange",
length: 3,
};
배열 요소의 참조/추가/갱신/삭제
const arr = [1, 2];
// 인덱스가 0인 요소를 참조
console.log(arr[0]); // 1
// 인덱스가 1인 요소를 참조
console.log(arr[1]); // 2
const arr = [1, 2];
// 인덱스가 2인 요소를 참조, 배열 arr에는 인덱스가 2인 요소가 존재하지 않는다.
console.log(arr[2]); // undefined
// 희소 배열
const arr = [1, , 3];
// 배열 arr에는 인덱스가 1인 요소가 존재하지 않는다.
console.log(Object.getOwnPropertyDesciptors(arr));
/*
{
'0': {value: 1, writable: true, enumerable: true, configurable: true}
'2': {value: 3, writable: true, enumerable: true, configurable: true}
length: {value: 3 writable: true, enumerable: false, configurable: false}
}
*/
// 존재하지 않는 요소를 참조하면 undefined가 반환된다.
const arr = [0];
// 배열 요소의 추가
arr[1] = 1;
console.log(arr); // [0, 1]
console.log(arr.length); // 2
arr[100] = 100;
console.log(arr); // [0, 1, empty * 98, 100]
console.log(arr.length); // [101]
console.log(Object.getOwnPropertyDesciptors(arr));
/*
{
'0': {value: 0, writable: true, enumerable: true, configurable: true}
'1': {value: 1, writable: true, enumerable: true, configurable: true}
'100': {value: 100, writable: true, enumerable: true, configurable: true}
length: {value: 3 writable: true, enumerable: false, configurable: false}
}
*/
// 요소값의 갱신
arr[1] = 10;
console.log(arr); // [0, 10 empty * 98, 100]
const arr = [];
// 배열 요소 추가
arr[0] = 1;
arr["1"] = 2;
// 프로퍼티 추가
arr["foo"] = 3;
arr.bar = 4;
arr[1.1] = 5;
arr[-1] = 6;
console.log(arr); // [1, 2, foo:3, bar:4, '1.1': 5, '-1':6]
// 프로퍼티는 length에 영향을 주지 않는다.
console.log(arr.length); // 2
const arr = [1,2,3];
// 배열 요소의 삭제
delete.arr[1];
console.log(arr); // [1, empty, 3]
// length 프로퍼티에 영향을 주지 않는다. 즉, 희소 배열이 된다.
console.log(arr.length); // 3
const arr = [1, 2, 3];
// splice(삭제를 시작할 인덱스, 삭제할 요소 수)
arr.splice(1, 1);
console.log(arr); // [1,3]
// length가 자동 갱신된다.
console.log(arr.length); // 2
많이 쓰는 배열 메서드
let fruits = ['apple', 'banana'];
fruits.push('orange');
console.log(fruits); // ['apple', 'banana', 'orange']
let fruits = ['apple', 'banana', 'orange'];
let lastFruit = fruits.pop();
console.log(lastFruit); // 'orange'
console.log(fruits); // ['apple', 'banana']
let fruits = ['apple', 'banana', 'orange'];
let firstFruit = fruits.shift();
console.log(firstFruit); // 'apple'
console.log(fruits); // ['banana', 'orange']
let fruits = ['banana', 'orange'];
const result = fruits.unshift('apple');
console.log(result); // 3
console.log(fruits); // ['apple', 'banana', 'orange']
let fruits = ['apple', 'banana', 'orange'];
fruits.splice(1, 1, 'grape');
console.log(fruits); // ['apple', 'grape', 'orange']
let fruits = ['apple', 'banana', 'orange', 'grape'];
let citrus = fruits.slice(1, 3);
console.log(citrus); // ['banana', 'orange']
0 이 예시에서 slice(1, 3)는 인덱스 1에서 시작해서 인덱스 3 이전까지의 요소를 반환한다.
let fruits = ['apple', 'banana'];
let moreFruits = ['orange', 'grape'];
let allFruits = fruits.concat(moreFruits);
console.log(allFruits); // ['apple', 'banana', 'orange', 'grape']
let fruits = ['apple', 'banana', 'orange'];
fruits.forEach(fruit => console.log(fruit));
// apple
// banana
// orange
let numbers = [1, 2, 3];
const doubled = numbers.map(number => number * 2);
console.log(doubled); // [2, 4, 6]
let numbers = [1, 2, 3, 4, 5];
const evenNumbers = numbers.filter(number => number % 2 === 0);
console.log(evenNumbers); // [2, 4]
let numbers = [1, 2, 3, 4];
numbers.reduce((누산값, 현재요소값, 현재요소의index, 현재배열) => {
return 다음누산값;
}, 초기누산값);
const sum = numbers.reduce((acc, number) => acc + number, 0);
console.log(sum); // 10