Lütfen bir jeneratör işlevi kullanarakObject.entries ve / veya bergi'nin cevabını kullanarak sıfırların cevabına bakın . Object.entriesSoru sorulduğunda henüz teknik özelliklerde yer almasa da , Aşama 4'teydi, böylece çoklu doldurmak ve Nisan 2016'da bile kullanmak çok güvenli (sadece). ( Buradaki aşamalarla ilgili daha fazla bilgi .) Ve jeneratör işlevleri ES2015'teydi. OP özellikle aracılardan kaçınmasını istedi ve jeneratör bundan tamamen kaçınmasa da aşağıdakilerden daha iyi bir iş çıkarır veya (biraz) Object.enties.
FWIW, şunu kullanarak Object.entries:
- Bir dizi oluşturur
[name, value]diziler geçmesinenew Map
MapYapıcı bir yineleyici elde etmek için bir dizi bir işlevini çağırır; dizi, bir dizi interator nesnesi oluşturur ve döndürür.
MapYineleyici nesne girdileri (almak için o yapıcı kullandığı [name, value]diziler) ve harita oluşturmak
Jeneratörü kullanma:
- Oluşturucu işlevinin çağrılması sonucunda bir üreteç nesnesi oluşturur
MapYapıcı ondan bir yineleyici elde etmek için bu jeneratör nesne üzerinde bir işlevini çağırır; jeneratör nesnesi kendini döndürür
MapYapıcı (bir yineleyici gibi) jeneratör nesne girişleri (almak için kullandığı [name, value]diziler) ve harita oluşturmak
Yani: Bir tane daha az aracı (dizi Object.entries).
Bununla birlikte, kullanmak Object.entriesdaha basittir ve bu diziyi oluşturmak her zaman bir sorun değildir. Yani gerçekten, ikisi de. Ama ikisi de aşağıdakilerden daha iyi. :-)
Orijinal cevap:
A'yı başlatmak için Map, diziler dizisi gibi anahtar / değer çiftlerini diziler olarak döndüren herhangi bir yineleyici kullanabilirsiniz:
const map = new Map([
['foo', 'bar']
]);
Nesneden haritaya yerleşik bir dönüştürme yoktur, ancak şunlarla kolayca yapılabilir Object.keys:
const map = new Map();
let obj = {foo: 'bar'};
Object.keys(obj).forEach(key => {
map.set(key, obj[key]);
});
Elbette, bunun üstesinden gelmek için kendinize bir işçi işlevi verebilirsiniz:
function buildMap(obj) {
let map = new Map();
Object.keys(obj).forEach(key => {
map.set(key, obj[key]);
});
return map;
}
Sonra
const map = buildMap({foo: 'bar'});
Ya da işte daha l33t görünümlü (bu hala bir şey mi?) Versiyon:
function buildMap(obj) {
return Object.keys(obj).reduce((map, key) => map.set(key, obj[key]), new Map());
}
(Evet, Map#setharita başvuru döndürür. Bazıları bu bir olduğunu iddia ediyorum abusage ait reduce.)
Ya da bilinmezliği gerçekten aşabiliriz:
const buildMap = o => Object.keys(o).reduce((m, k) => m.set(k, o[k]), new Map());
Hayır, bunu asla gerçek yapmam. :-)
Object.entriesGerçekten iyi bir yaklaşım bittiObject.keysve BERGI en jeneratör işlevi yaklaşımı ikisinden de biraz daha doğrudan olduğuObject.keysveyaObject.entries.