Будь ласка, дивіться відповіді нулів, використовуючиObject.entries та / або відповідь Бергі, використовуючи функцію генератора . Хоча Object.entriesще не було в специфіці, коли питання було задано, це було на 4 етапі , настільки безпечно для поліфазування та використання навіть у квітні 2016 року (просто). (Детальніше про етапи тут .) А функції генератора були в ES2015. ОП спеціально просило уникати посередників, і хоча генератор цього зовсім не уникає, він робить кращу роботу, ніж нижче або (трохи) 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повертає посилання на карту. Деякі стверджують , це abusage з 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.