'순회(iteration)'에 대해서 알아보자.
반복(loop)과 순회(iteration)의 관계로 설명할 수 있다.
for(let i = 0; i < 3; i++){
alert(i);
}
위 반복문에서 소괄호 내에는 초기식, 조건식, 증감식이 명시되어 있다. 이에 따라 코드블럭(중괄호 안의 코드)를 '반복'시킨다.
다른 반복문인 while, do...while문도 마찬가지이다.
'코드블럭'을 조건에 따라 여러 번 실행하는 것이 반복(loop)이다.
위 예시에서는 초기식에 따라 i의 초기 값은 0이며, 조건식에 부합하면 코드블럭이 실행되고 증감식이 실행되어 i가 1이 된다.
이 때 각각의 실행 한 번을 순회(iteration)라고 할 수 있다.
조금 더 엄밀히 따지면 순회는 컬렉션(collection)의 각 항목(item)을 처리하는 것이다.
컬렉션(collection) : 여러 데이터의 모음
ex. 배열(Array), 객체(Object), 맵(Map), 셋(Set)
순회에 필요한 메서드는 map.keys(), map.values(), map.entires()등이 있다.
이와 같은 메서드는 포괄적인 용도로 만들어졌다.
따라서 다음과 같은 '특정 자료구조'에서 사용 가능하다.
일반 객체에도 순회 관련 메서드가 있지만 위 메서드 문법과는 차이가 있다.
다른 커스텀 자료구조에서는 순회 메서드를 사용하려면 직접 구현해야 한다.
일반 객체엔 다음과 같은 메서드를 사용할 수 있다.
위 메서드를 Map, Set, Array 전용 메서드와 비교하면 다음과 같다.
첫 번째 차이 : obj.keys()가 아닌 Object.keys(obj) 호출
두 번째 차이 : Objects.* 호출 시 iterable 객체가 아닌 배열을 반환
let user = {
name: "John",
age: 30
};
Object.keys(user) = ["name", "age"]
Object.values(user) = ["John", 30]
Object.entries(user) = [ ["name","John"], ["age",30] ]
(이 때 심볼형 프로퍼티는 무시한다.)
map, filter 등과 같은 배열 전용 메서드는 객체에서 사용할 수 없다.
하지만 Object.entries와 Object.fromEntries를 순차적으로 적용하면 객체에도 배열 전용 메서드 사용할 수 있다.
이 방법을 사용해 가격 정보가 저장된 객체 prices의 프로퍼티 값을 두 배로 늘리는 예시
let prices = {
banana: 1,
orange: 2,
meat: 4,
};
let doublePrices = Object.fromEntries(
// 객체를 배열로 변환해서 배열 전용 메서드인 map을 적용하고 fromEntries를 사용해 배열을 다시 객체로 되돌립니다.
Object.entries(prices).map(([key, value]) => [key, value * 2])
);
alert(doublePrices.meat); // 8