Làm cách nào để chuyển đổi các phím Map thành mảng?


237

Hãy nói rằng tôi có bản đồ sau:

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

Và tôi muốn có được ['a', 'b'] dựa trên những điều trên. Giải pháp hiện tại của tôi có vẻ rất dài và khủng khiếp.

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

Có phải là một cách tốt hơn, không?


17
Có lẽ Array.from(Map.keys()).
Dan D.


5
@gK. Nó không hoạt động với Map.
pawel 11/2/2016

@pawel ơi xin lỗi rồi!
hamnix

Array.from(Map.values())- nếu trong trường hợp, bạn cần các giá trị, thay vì các khóa.
Manohar Reddy Poreddy

Câu trả lời:


436

Map.keys()trả về một MapIteratorđối tượng có thể được chuyển đổi sang Arraysử dụng Array.from:

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

EDIT: bạn cũng có thể chuyển đổi đối tượng lặp thành mảng bằng cú pháp lây lan

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

6
Tôi thích việc sử dụng Trình điều khiển trải rộng, tuy nhiên, trình chuyển mã TypeScript của tôi ném this.map.values().slice is not a function. Có lẽ tôi nên cập nhật.
Cody

4
@Cody đó là vì lệnh slice()gọi của bạn đang được thực thi trước toán tử lây lan. Hãy thử[ ... Array.from(map.values()).slice(0) ]
mgthomas99

5
TypeScript 2.7.2 nói về điều này: const fooMap = new Map<number, string>(); const fooArray = [...fooMap.keys()];như sau: TS2461: Loại 'IterableIterator <number>' không phải là một kiểu mảng. Vì vậy, điều này không được phép trong TypeScript. Array.from hoạt động như mong đợi.
Stefan Rein

Toán tử trải rộng @StefanRein Kiểu mô tả trông giống nhau, nhưng không tương đương với chênh lệch ES6, vì nó chỉ hoạt động với các kiểu Array và Object, trong khi ES6 hoạt động với bất kỳ lần lặp nào. Bạn có thể ví dụ như làm ..."abc"để có được ["a","b","c"]trong ES6, đó là không thể trong TS.
pawel

@pawel ..."abc"cũng không hoạt ...("abc")động trong bảng điều khiển chrome, hỗ trợ ES6?
Stefan Rein

15

Bạn có thể sử dụng toán tử trải rộng để chuyển đổi trình lặp Map.keys () trong một mảng.

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()) không hoạt động trong các tập lệnh ứng dụng google.

Cố gắng sử dụng nó dẫn đến lỗi TypeError: Cannot find function from in object function Array() { [native code for Array.Array, arity=1] }.

Để có danh sách các khóa trong GAS, hãy làm điều này:

var keysList = Object.keys(myMap);

Điều này làm việc cho tôi, và câu trả lời đầu tiên đã không. Tôi không sử dụng Google ... nhưng vẫn nhận được lỗi cho biết map.keys()giá trị trả về không lặp lại được.
Azurespot

5

Tôi cần một cái gì đó tương tự với hình thức phản ứng góc cạnh:

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

Không chính xác câu trả lời tốt nhất cho câu hỏi nhưng thủ thuật này new Array(...someMap)đã tiết kiệm cho tôi vài lần khi tôi cần cả khóa và giá trị để tạo mảng cần thiết. Ví dụ: khi cần tạo các thành phần phản ứng từ đối tượng Map dựa trên cả hai giá trị khóa và giá trị.

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

1

OK, hãy đi toàn diện hơn một chút và bắt đầu với Bản đồ cho những ai không biết tính năng này trong JavaScript ... MDN nói:

Đối tượng Map giữ các cặp khóa-giá trị và ghi nhớ thứ tự chèn ban đầu của các khóa.
Mọi giá trị (cả đối tượng và giá trị nguyên thủy) có thể được sử dụng làm khóa hoặc giá trị.

Như bạn đã đề cập, bạn có thể dễ dàng tạo một bản sao của Bản đồ bằng từ khóa mới ... Trong trường hợp của bạn:

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

Vậy hãy xem ...

Cách bạn đề cập là một cách OK để làm điều đó, nhưng vâng, có nhiều cách ngắn gọn hơn để làm điều đó ...

Bản đồ có nhiều phương thức mà bạn có thể sử dụng, giống như set()bạn đã sử dụng để gán các giá trị chính ...

Một trong số đó là keys()trả về tất cả các khóa ...

Trong trường hợp của bạn, nó sẽ trở lại:

MapIterator {"a", "b"}

và bạn dễ dàng chuyển đổi chúng thành Mảng bằng các cách ES6 , như toán tử trải ...

const b = [...myMap.keys()];
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.