배열(array)
- 특수한 객체.
- 배열을 구성하는 컨텐츠는 요소 또는 원소(element). (객체의 프로퍼티 또는 속성)
- 객체와 다르게 컨테츠에 항상 순서가 있음.
- 배열에서의 키는 인덱스(index)라 하고,
- 객체와 다르게 순차적인 숫자임. (0부터 오름차순)
- 각 원소에 각종 데이터 타입(Data types)이 섞여 들어감.
- 하지만 동일한 데이터 타입의 요소를 사용하는 것이 예측 가능성을 높일 수 있고, 코드의 가독성을 향상시키는 데 도움이 됨.
- 배열의 크기는 고정되지 않음. (언제든 변경 가능)
배열 생성
[]
를 이용함.
- 원소를
,
로 구분.
- 원소에 접근할 때는
[]
안에 index를 씀.
- 덮어쓸 때는 새 값을 할당.
const array = [1, 'blabla', {}, 4];
console.log(array);
console.log(array[0]);
const objects = [{ name: '멍멍이' }, { name: '냐옹이' }];
console.log(objects);
console.log(objects[1]);
비구조화 할당(destructuring assignment)
- 배열도 객체이기 때문에 비구조화 할당 가능.
- 비구조화 할당 내용. (객체)
배열 조작 메서드(array method)
- 배열 내장 함수.
- 콜백을 이용하는 배열 조작 메서드는 기본적으로 원소를 하나씩 순차적으로 빼내는 기능이 있음. (마치
for
loop의 기능 내장)
- 객체의 접근자 프로퍼티 처럼 조회만 해도 호출이 되기도함.
.length
- 원소의 개수(배열의 크기) 반환하는 프로퍼티.
- 배열 조작 메서드는 아니지만 참고.
const objects = [{ name: '멍멍이' }, { name: '냐옹이' }];
console.log(objects.length);
objects.push({ name: '멍뭉이' });
console.log(objects.length);
.push()
- 배열에 마지막에 새로운 원소 추가.
- 기존의 배열을 수정함.
- 파라미터 안에 추가하고자 하는 원소 값 입력.
const objects = [{ name: '멍멍이' }, { name: '냐옹이' }];
objects.push({ name: '멍뭉이' });
console.log(objects);
Array.prototype.forEach()
arr.forEach(callback(currentvalue[, index[, array]])[, thisArg])
currentvalue
: 처리할 현재 요소
index
: 처리할 현재 요소의 인덱스
array
: 메소드를 호출한 배열
thisArg
: callback
실행시 this
값
- 배열에 있는 각 요소에 대해 오름차순으로 한번 실행됨.
- 초기화하지 않은 인덱스 속성은 실행하지 않음. (
empty items
등)
- 호출한 배열을 변형하지 않음.
const superheroes = ['아이언맨', '캡틴', '토르'];
function print(hero) {
console.log(hero);
}
superheroes.forEach(print);
const superheroes = ['아이언맨', '캡틴', '토르'];
superheroes.forEach(function (hero) {
console.log(hero);
});
const superheroes = ['아이언맨', '캡틴', '토르'];
superheroes.forEach((hero) => {
console.log(hero);
});
.map()
- 배열 안의 모든 원소를 변환 하여 새로운 배열 생성. (forEach + push)
.map(currentValue)
가 필수 요소. (currentValue: 처리할 현재 요소)
.map(currentValue,index)
(index: 처리할 현재 요소의 인덱스)
map()
함수 또한 파라미터로 함수 형태가 들어가며 그 함수의 파라미터는 배열의 각 원소를 의미함.
- 즉, 콜백 함수
const array = [1, 2, 3, 4, 5, 6, 7, 8];
const squared = [];
array.forEach((n) => {
squared.push(n * n);
});
console.log(squared);
const array = [1, 2, 3, 4, 5, 6, 7, 8];
const squared = array.map((n) => n * n);
console.log(squared);
const items = [
{
id: 1,
text: 'hello',
},
{
id: 2,
text: 'bye',
},
];
const texts = items.map((item) => item.text);
console.log(texts);
.indexOf()
- 문자열, 숫자, 불리언 등의 항목이 몇번째 원소인지 인덱스 값 반환.
- 단, 가장 첫번째로 찾은 원소의 순서만 반환하고 종료 됨.
const superheroes = ['아이언맨', '침착맨', '토르'];
const index = superheroes.indexOf('침착맨');
console.log(index);
.findIndex()
- 객체나 특정 조건에 부합하는 원소의 인덱스 값 반환.
- 단, 가장 첫번째로 찾은 원소의 순서만 반환하고 종료 됨.
- 콜백 함수로 파라미터로 함수를 받음.
const todos = [
{
id: 1,
text: '침착맨',
done: true,
},
{
id: 2,
text: '주펄',
done: true,
},
{
id: 3,
text: '김풍',
done: true,
},
{
id: 4,
text: '기안84',
done: false,
},
];
const index = todos.findIndex((todo) => todo.done === false);
console.log(index);
.find()
- 객체나 특정 조건에 부합하는 원소(객체자체)를 반환.
- 단, 가장 첫번째로 찾은 원소의 값만 반환하고 종료 됨.
- 콜백 함수로 파라미터로 함수를 받음.
const todos = [
{
id: 1,
text: '침착맨',
done: true,
},
{
id: 2,
text: '주펄',
done: true,
},
{
id: 3,
text: '김풍',
done: true,
},
{
id: 4,
text: '기안84',
done: false,
},
];
const todo = todos.find((todo) => todo.done === false);
console.log(todo);
.filter()
- 특정 조건을 만족하는 원소들 새로운 배열로 만듬.
.push()
의 기능 까지 소유한 느낌.
const arr = [...new Array(10)].map((_, i) => i + 1).filter((v) => v % 3 !== 0);
console.log(arr);
const todos = [
{
id: 1,
text: '침착맨',
done: true,
},
{
id: 2,
text: '주펄',
done: true,
},
{
id: 3,
text: '김풍',
done: true,
},
{
id: 4,
text: '기안84',
done: false,
},
];
const tasksNotDone = todos.filter((todo) => todo.done);
console.log(tasksNotDone);
.splice()
- 배열의 원소를 삭제함.
- 기존의 배열을 수정함.
- 삭제된 원소들을 배열로서 받을 수 있음. (
.push()
불필요)
- 파라미터는
(인덱스 값, 총 삭제할 원소 개수)
.
- 파라미터에 삭제하고자 하는 원소의 인덱스 값 입력.
- 이어서 총 삭제할 원소의 개수도 지정 가능.
const numbers = [10, 20, 30, 40];
const index = numbers.indexOf(30);
const spliced = numbers.splice(index, 2);
console.log(spliced);
console.log(numbers);
.slice()
- 배열을 잘라냄. (사실
ctrl+c
& ctrl+v
가 더 어울리므로 복붙에 가까움)
.splice()
와 다르게 기존의 배열을 건드리지 않음.
- 파라미터는
(인덱스 값(이상),인덱스 값(미만))
.
const numbers = [10, 20, 30, 40];
const sliced = numbers.slice(0, 2);
console.log(sliced);
console.log(numbers);
.shift()
- 배열 안에 있는 첫번째 원소를 추출. (잘라내기)
- 기존의 배열을 수정함.
- 파라미터는 비어있음.
.unshift()
와 반대 기능.
const numbers = [10, 20, 30, 40];
const value = numbers.shift();
const value2 = numbers.shift();
console.log(value);
console.log(value2);
console.log(numbers);
.pop()
- 배열 안에 있는 마지막 원소를 추출. (잘라내기)
- 기존의 배열을 수정함.
- 파라미터는 비어있음.
.push()
와 반대 기능.
const numbers = [10, 20, 30, 40];
const value = numbers.pop();
const value2 = numbers.pop();
console.log(value);
console.log(value2);
console.log(numbers);
.unshift()
- 배열에 첫번째에 새로운 원소 추가.
- 기존의 배열을 수정함.
- 파라미터 안에 추가하고자 하는 원소 값 입력.
const numbers = [10, 20, 30, 40];
numbers.unshift(5);
console.log(numbers);
.concat()
- 여러 개의 배열을 하나의 배열로 합쳐줌.
- 기존의 배열은 건드리지 않음.
- 파라미터 안에 합치고자 하는 배열 중 하나를 입력.
const arr1 = [1, 2, 3];
const arr2 = [4, 5, 6];
const concated = arr1.concat(arr2);
console.log(arr1);
console.log(arr2);
console.log(concated);
.join()
- 배열안의 원소를 문자열 형태로 합침.
- 파라미터의 값은 구분기호(separator)를 의미함.
- 비워두면 기본값인
,
(콤마).
const arr = [1, 2, 3, 4, 5];
console.log(arr.join());
console.log(arr.join(''));
console.log(arr.join('---'));
.reduce()
- 요약, 계산, 값 구하기 등의 기능. (like 피벗테이블)
- 매우 유용한 콜백 함수.
- 특이한 점이 많은데 첫번째로 반환 값(return value)은 누산기(accumulator; acc) 값.
- 파라미터는
((함수), (누산기의 초기값; initialValue))
로 구성됨.
- 또한 함수는
(누산기(accumulator), 현재 원소(currentValue), 현재 인덱스(currentIndex), 호출한 배열(array))
4가지의 매개변수를 가지게 됨.
- 이 중
누산기(accumulator)
와 현재 원소(currentValue
는 필수 값.
- 또한 매개변수의 이름은 동일하지 않아도 문제가 없음.
const numbers = [1, 2, 3, 4, 5];
let sum = 0;
numbers.forEach((n) => {
sum += n;
});
console.log(sum);
const numbers = [1, 2, 3, 4, 5];
function numSum(acc, current) {
return acc + current;
}
const sum = numbers.reduce(numSum, 0);
console.log(sum);
const numbers = [1, 2, 3, 4, 5];
const sum = numbers.reduce((acc, current) => acc + current, 0);
console.log(sum);
const numbers = [1, 2, 3, 4, 5];
const sum = numbers.reduce((acc, current, index, array) => {
if (index === array.length - 1) {
return (acc + current) / array.length;
}
return (acc += current);
}, 0);
console.log(sum);
const alphabets = ['a', 'a', 'a', 'b', 'c', 'c', 'd', 'e'];
const counts = alphabets.reduce((acc, current) => {
if (acc[current]) {
acc[current] += 1;
} else {
acc[current] = 1;
}
return acc;
}, {});
console.log(counts);