Будь ласка, дивіться відповіді нулів, використовуючи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
.