지도 키를 배열로 변환하는 방법?


237

다음과 같은지도가 있다고 가정하겠습니다.

let myMap = new Map().set('a', 1).set('b', 2);

그리고 위의 내용에 기초하여 [ 'a', 'b']를 얻고 싶습니다. 내 현재 솔루션은 너무 길고 끔찍한 것 같습니다.

let myMap = new Map().set('a', 1).set('b', 2);
let keys = [];
for (let key of myMap)
  keys.push(key);
console.log(keys);

더 좋은 방법이 있어야합니까?


17
아마도 Array.from(Map.keys()).
Dan D.


5
@gK. 작동하지 않습니다 Map.
pawel

@pawel 아 죄송합니다!
hamnix

Array.from(Map.values())-필요한 경우 키 대신 값이 필요합니다.
마노 하르 레디 포로 디

답변:


436

Map.keys()MapIteratorArray사용하여 변환 할 수 있는 객체를 반환합니다 Array.from.

let keys = Array.from( myMap.keys() );
// ["a", "b"]

편집 : 확산 구문을 사용하여 반복 가능한 객체를 배열로 변환 할 수도 있습니다

let keys =[ ...myMap.keys() ];
// ["a", "b"]

6
Spread Operator를 사용하는 것이 좋지만 TypeScript 트랜스 필러가 throw this.map.values().slice is not a function합니다. 어쩌면 내가 업데이트해야합니다.
Cody

4
@Cody slice()는 스프레드 연산자 전에 호출이 실행되기 때문 입니다. 시도[ ... Array.from(map.values()).slice(0) ]
mgthomas99

5
TypeScript 2.7.2는이를 const fooMap = new Map<number, string>(); const fooArray = [...fooMap.keys()];위해 다음과 같이 설명합니다. TS2461 : 'IterableIterator <number>'유형은 배열 유형이 아닙니다. 따라서 TypeScript에서는 허용되지 않습니다. Array.from이 예상대로 작동합니다.
Stefan Rein

@StefanRein Typescript 스프레드 연산자는 동일하게 보이지만 ES6 스프레드와 동일하지는 않습니다. ES6 스프레드는 Array 및 Object 형식에서만 작동하지만 ES6은 반복 가능으로 작동합니다. 당신은 할 예를 들면 수 있습니다 ..."abc"얻을 ["a","b","c"]TS에 수 없습니다 ES6에.
pawel

@pawel ..."abc"또는 ...("abc")ES6를 지원하는 크롬 콘솔에서 작업하고 있지 않습니까?
Stefan Rein

15

스프레드 연산자를 사용하여 Map.keys () 반복자를 배열 로 변환 할 수 있습니다 .

let myMap = new Map().set('a', 1).set('b', 2).set(983, true)
let keys = [...myMap.keys()]
console.log(keys)


6

Array.from(myMap.keys()) Google 응용 프로그램 스크립트에서는 작동하지 않습니다.

사용하려고하면 오류가 발생 TypeError: Cannot find function from in object function Array() { [native code for Array.Array, arity=1] }합니다.

GAS에서 키 목록을 얻으려면 다음을 수행하십시오.

var keysList = Object.keys(myMap);

이것은 저에게 효과적이며 첫 번째 대답은 효과가 없었습니다. Google을 사용하지 않고 있지만 map.keys()반환 값을 반복 할 수 없다는 오류가 계속 발생합니다 .
Azurespot

5

각도 반응 형태와 비슷한 것이 필요합니다.

let myMap = new Map().set(0, {status: 'VALID'}).set(1, {status: 'INVALID'});
let mapToArray = Array.from(myMap.values());
let isValid = mapToArray.every(x => x.status === 'VALID');

2

질문에 대한 최상의 대답은 아니지만이 트릭 new Array(...someMap)은 필요한 배열을 생성하기 위해 키와 값이 모두 필요할 때 몇 번 절약했습니다. 예를 들어 키와 값을 모두 기반으로 Map 객체에서 반응 구성 요소를 생성해야하는 경우.

  let map = new Map();
  map.set("1", 1);
  map.set("2", 2);
  console.log(new Array(...map).map(pairs => pairs[0])); -> ["1", "2"]

1

자, 좀 더 포괄적으로 가서 JavaScript에서이 기능을 모르는 사람들을위한 지도 를 시작하겠습니다 ... MDN의 말 :

Map 객체는 키-값 쌍을 보유하며 키의 원래 삽입 순서를 기억합니다.
모든 값 (객체 및 기본 값 모두)은 키 또는 값으로 사용될 수 있습니다.

언급했듯이 새 키워드를 사용하여 Map 인스턴스를 쉽게 만들 수 있습니다. 귀하의 경우 :

let myMap = new Map().set('a', 1).set('b', 2);

그럼 보자 ...

당신이 언급 한 방법은 그것을 할 수있는 좋은 방법이지만, 그래, 더 간결한 방법이 있습니다 ...

Map 에는 set()이미 키 값을 할당하는 데 사용한 것과 같은 여러 가지 방법이 있습니다 .

그들 중 하나 keys()는 모든 키를 반환하는 것입니다 ...

귀하의 경우에는 다음을 반환합니다.

MapIterator {"a", "b"}

스프레드 연산자와 같은 ES6 방식을 사용하여 쉽게 배열로 변환합니다 .

const b = [...myMap.keys()];
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.