반응형

순회(iteration)에 관해

순회에 필요한 메서드 map.keys(), map.values(), map.entries() 들은 포괄적인 용도로 만들어져서

메서드를 적용할 자료구조는 일련의 합의를 준수해야 한다.

커스텀 자료구조를 대상으로 순회를 해야 한다면 이 메서드들은 사용하지 못하고 직접 메서드를 구현해야한다.

 

keys(), values(), entries() 를 사용할 수 있는 자료구조

 

  • Map
  • Set
  • Array

 

Object.keys, values, entries

일반 객체에도 순회 관련 메서드가 있는데 위의 메서드와 문법에 차이가 있다.

Object.keys(obj) – 객체의 키만 담은 배열을 반환합니다.

Object.values(obj) – 객체의 값만 담은 배열을 반환합니다.

Object.entries(obj) – [키, 값] 쌍을 담은 배열을 반환합니다.

차이점

  객체
호출 문법 map.keys() Object.keys(obj)(obj.keys() 아님)
반환 값 iterable 객체 ‘진짜’ 배열

 

이렇게 문법이 다른 이유는 유연성 때문이다.

자바스크립트에선 복잡한 자료구조 전체가 객체에 기반하는데 객체 data 자체적으로 data.values()라는 메서드를

구현해 사용하더라도 Object.values(data) 같은 형태로 메서드를 호출할 수 있으면 커스텀 메서드와 내장 메서드 둘 다를 사용할 수 있다.

 

let user = {
  name: "Violet",
  age: 30
};

// 값을 순회합니다.
for (let value of Object.values(user)) {
  alert(value); // Violet과 30이 연속적으로 출력됨
}
  • Object.values를 사용하면 프로퍼티 값을 대상으로 원하는 작업가능

 

심볼형 프로퍼티 무시

for..in 반복문처럼, Object.keys, Object.values, Object.entries는 키가 심볼형인 프로퍼티를 무시합니다.

심볼형 키만 배열 형태로 반환해주는 메서드인 Object.getOwnPropertySymbols 사용하면 된다.

 

객체 변환하기

객체->배열, 배열메소드 사용-> 객체

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
반응형