См. Ответ nils с использованиемObject.entries и / или ответ Bergi с использованием функции генератора . Хотя Object.entriesкогда задавался вопрос, он еще не входил в спецификацию, но он находился на этапе 4 , поэтому его можно было полифиллировать и использовать даже в апреле 2016 года (просто). (Подробнее об этапах здесь .) И функции генератора были в ES2015. OP специально просил избегать посредников, и хотя генератор не полностью избегает этого, он работает лучше, чем ниже или (немного) Object.enties.
FWIW, используя Object.entries:
- Создает массив
[name, value]массивов для передачиnew Map
MapКонструктор вызывает функцию на массив , чтобы получить итератор; массив создает и возвращает объект-интегратор массива.
- В
Mapиспользуете конструктора , который итератор объект , чтобы получить записи (в [name, value]массивах) и построить карту
Используя генератор:
- Создает объект-генератор в результате вызова функции-генератора
MapКонструктор вызывает функцию на этом объекте генератора , чтобы получить итератор от него; объект-генератор возвращает себя
MapКонструктор использует объект генератора ( в качестве итератора) , чтобы получить записи (в [name, value]массивах) и построить карту
Итак: На одного посредника меньше (массив из Object.entries).
Однако использовать Object.entriesпроще, и создание этого массива не является проблемой в 99,999% случаев. Так что действительно, любой. Но они оба лучше, чем ниже. :-)
Оригинальный ответ:
Для инициализации a Mapвы можете использовать любой итератор, который возвращает пары ключ / значение в виде массивов, например массив массивов:
const map = new Map([
['foo', 'bar']
]);
Встроенного преобразования из объекта в карту нет, но это легко сделать с помощью Object.keys:
const map = new Map();
let obj = {foo: 'bar'};
Object.keys(obj).forEach(key => {
map.set(key, obj[key]);
});
Вы, конечно, можете дать себе рабочую функцию для этого:
function buildMap(obj) {
let map = new Map();
Object.keys(obj).forEach(key => {
map.set(key, obj[key]);
});
return map;
}
затем
const map = buildMap({foo: 'bar'});
Или вот более l33t-выглядящая (это все еще актуально?) Версия:
function buildMap(obj) {
return Object.keys(obj).reduce((map, key) => map.set(key, obj[key]), new Map());
}
(Да, Map#setвозвращает ссылку на карту. Некоторые утверждают, что это неправомерное использование reduce.)
Или мы можем действительно перейти на топ на неизвестность:
const buildMap = o => Object.keys(o).reduce((m, k) => m.set(k, o[k]), new Map());
Нет, я бы никогда этого не сделал. :-)
Object.entriesдействительно лучший подходObject.keys, и подход функции генератора Берги немного более прямой, чем любойObject.keysилиObject.entries.