[모던 자바스크립트 튜토리얼] 5.9 Object.keys, values, entries

개발견 배도르만·2023년 4월 9일
0
post-thumbnail

순회(Iteration)

'순회(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

일반 객체에도 순회 관련 메서드가 있지만 위 메서드 문법과는 차이가 있다.

다른 커스텀 자료구조에서는 순회 메서드를 사용하려면 직접 구현해야 한다.

Object.keys, values, entries

일반 객체엔 다음과 같은 메서드를 사용할 수 있다.

  • Object.keys(obj) - 객체의 키만 담은 배열 반환
  • Object.values(obj) - 객체의 값만 담은 배열 반환
  • Object.entries(obj) - 객체의 [키, 값] 쌍을 담은 배열 반환

위 메서드를 Map, Set, Array 전용 메서드와 비교하면 다음과 같다.

첫 번째 차이 : obj.keys()가 아닌 Object.keys(obj) 호출

  • Object 클래스 자체 함수(정적 메서드)를 사용하면 Object 타입의 변수 obj에 따로 keys()라는 함수를 만들어 유연한 사용이 가능하다.

두 번째 차이 : 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.entriesObject.fromEntries를 순차적으로 적용하면 객체에도 배열 전용 메서드 사용할 수 있다.

  1. Object.entries(obj)를 사용해 객체의 키-값 쌍이 요소인 배열을 얻는다.
  2. 1.에서 만든 배열에 map 등의 배열 전용 메서드를 적용합니다.
  3. 2.에서 반환된 배열에 Object.fromEntries(array)를 적용해 배열을 다시 객체로 되돌립니다.

이 방법을 사용해 가격 정보가 저장된 객체 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

✍️ 정리

  • keys(), values(), entries()를 객체에서 사용하려면 Object.keys(obj) 의 형식으로 사용할 수 있다.
  • 객체에서 map, filter 메서드를 사용할 수 없으나 Object.entries, Object.fromEntries를 순차적으로 적용하면 사용할 수 있다.
profile
네 발 개발 개

0개의 댓글