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.entries
chư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
Map
tạ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
Map
tạ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
Map
tạ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#set
trả 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.entries
thực sự là cách tiếp cận tốt hơnObject.keys
và 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.keys
hoặcObject.entries
.