Silakan lihat jawaban nils menggunakanObject.entries
dan / atau jawaban bergi menggunakan fungsi generator . Meskipun Object.entries
belum ada dalam spesifikasi ketika pertanyaan diajukan, itu berada di Tahap 4 , jadi aman untuk melakukan polyfill dan digunakan bahkan pada bulan April 2016 (hanya). (Lebih lanjut tentang tahapan di sini .) Dan fungsi generator ada di ES2015. OP secara khusus diminta untuk menghindari perantara, dan sementara generator tidak sepenuhnya menghindarinya, ia melakukan pekerjaan yang lebih baik daripada di bawah atau (sedikit) Object.enties
.
FWIW, menggunakan Object.entries
:
- Membuat
[name, value]
larik untuk diteruskannew Map
- The
Map
konstruktor memanggil fungsi pada array untuk mendapatkan iterator; array membuat dan mengembalikan objek interator array.
- The
Map
penggunaan konstruktor bahwa objek iterator untuk mendapatkan entri (dalam [name, value]
array) dan membangun peta
Menggunakan generator:
- Membuat objek generator sebagai hasil dari pemanggilan fungsi generator
- The
Map
konstruktor memanggil fungsi pada objek generator untuk mendapatkan iterator dari itu; objek generator mengembalikan dirinya sendiri
- The
Map
konstruktor menggunakan objek Generator (sebagai iterator) untuk mendapatkan entri (dalam [name, value]
array) dan membangun peta
Jadi: Satu perantara lebih sedikit (array dari Object.entries
).
Namun, menggunakan Object.entries
lebih sederhana dan membuat array itu tidak menjadi masalah 99,999% dari waktu. Jadi sungguh, salah satunya. Tapi keduanya lebih baik dari yang di bawah. :-)
Jawaban asli:
Untuk menginisialisasi a Map
, Anda dapat menggunakan iterator apa pun yang mengembalikan pasangan kunci / nilai sebagai array, seperti array array:
const map = new Map([
['foo', 'bar']
]);
Tidak ada konversi bawaan dari objek ke peta, tetapi itu mudah dilakukan dengan Object.keys
:
const map = new Map();
let obj = {foo: 'bar'};
Object.keys(obj).forEach(key => {
map.set(key, obj[key]);
});
Anda bisa, tentu saja, memberi diri Anda fungsi pekerja untuk mengatasinya:
function buildMap(obj) {
let map = new Map();
Object.keys(obj).forEach(key => {
map.set(key, obj[key]);
});
return map;
}
Kemudian
const map = buildMap({foo: 'bar'});
Atau inilah versi yang lebih mirip l33t (apakah itu masih ada?):
function buildMap(obj) {
return Object.keys(obj).reduce((map, key) => map.set(key, obj[key]), new Map());
}
(Ya, Map#set
mengembalikan referensi peta. Beberapa berpendapat ini merupakan abusage dari reduce
.)
Atau kita benar - benar bisa berlebihan dalam ketidakjelasan:
const buildMap = o => Object.keys(o).reduce((m, k) => m.set(k, o[k]), new Map());
Tidak, saya tidak akan pernah melakukan itu secara nyata. :-)
Object.entries
benar-benar pendekatan yang lebih baikObject.keys
, dan pendekatan fungsi generator bergi sedikit lebih langsung daripadaObject.keys
atauObject.entries
.