См. Ответ 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
.