Vui lòng xem câu trả lời của nils bằng cách sử dụngObject.entries và / hoặc câu trả lời của bergi bằng cách sử dụng hàm máy phát điện . Mặc dù Object.entrieschưa có trong thông số kỹ thuật khi câu hỏi được đặt ra, nhưng nó đã ở Giai đoạn 4 , rất an toàn để polyfill và sử dụng ngay cả vào tháng 4 năm 2016 (chỉ). (Xem thêm về các giai đoạn tại đây .) Và các chức năng của máy phát điện có trong ES2015. OP đã yêu cầu đặc biệt tránh những người trung gian, và mặc dù máy phát điện không hoàn toàn tránh được điều đó, nhưng nó hoạt động tốt hơn những điều dưới đây hoặc (một chút) Object.enties.
FWIW, sử dụng Object.entries:
- Tạo một mảng các
[name, value]mảng để chuyển đếnnew Map
- Các
Map tạo gọi một hàm trên mảng để lấy một trình lặp; mảng tạo và trả về một đối tượng số nguyên mảng.
- Hàm
Maptạo sử dụng đối tượng trình vòng lặp đó để lấy các mục nhập ( [name, value]mảng) và xây dựng bản đồ
Sử dụng máy phát điện:
- Tạo đối tượng trình tạo do gọi hàm trình tạo
- Hàm
Maptạo gọi một hàm trên đối tượng trình tạo đó để lấy một trình lặp từ nó; đối tượng trình tạo trả về chính nó
- Hàm
Maptạo sử dụng đối tượng trình tạo (như một trình lặp) để lấy các mục nhập ( [name, value]mảng) và xây dựng bản đồ
Vì vậy: Ít hơn một trung gian (mảng từ Object.entries).
Tuy nhiên, việc sử dụng Object.entriesđơn giản hơn và việc tạo mảng đó không phải là vấn đề 99,999% thời gian. Vì vậy, thực sự, một trong hai. Nhưng cả hai đều tốt hơn những thứ bên dưới. :-)
Câu trả lời ban đầu:
Để khởi tạo a Map, bạn có thể sử dụng bất kỳ trình lặp nào trả về các cặp khóa / giá trị dưới dạng mảng, chẳng hạn như một mảng của mảng:
const map = new Map([
['foo', 'bar']
]);
Không có chuyển đổi tích hợp từ đối tượng sang bản đồ, nhưng nó dễ dàng được thực hiện với Object.keys:
const map = new Map();
let obj = {foo: 'bar'};
Object.keys(obj).forEach(key => {
map.set(key, obj[key]);
});
Tất nhiên, bạn có thể tạo cho mình một hàm worker để xử lý điều đó:
function buildMap(obj) {
let map = new Map();
Object.keys(obj).forEach(key => {
map.set(key, obj[key]);
});
return map;
}
Sau đó
const map = buildMap({foo: 'bar'});
Hoặc đây là một phiên bản trông giống l33t hơn (đó vẫn là một thứ?):
function buildMap(obj) {
return Object.keys(obj).reduce((map, key) => map.set(key, obj[key]), new Map());
}
(Có, Map#settrả về tham chiếu bản đồ. Một số cho rằng đây là sự lạm dụng reduce.)
Hoặc chúng ta thực sự có thể vượt lên trên về sự mù mờ:
const buildMap = o => Object.keys(o).reduce((m, k) => m.set(k, o[k]), new Map());
Không, tôi sẽ không bao giờ làm điều đó thật. :-)
Object.entriesthực sự là cách tiếp cận tốt hơnObject.keysvà cách tiếp cận hàm trình tạo của bergi trực tiếp hơn một chút so vớiObject.keyshoặcObject.entries.