Подтвердить что ты не робот

В Javascript понимается словарь или объект `map`

Мне нужно создать пару объектов из списков в Javascript. В Python я бы написал следующее:

{key_maker(x): val_maker(x) for x in a_list}

Другой способ спросить: существует ли что-то вроде jQuery.map(), которое агрегирует объекты? Здесь мое предположение (не работает):

var result = {}
$.map(a_list, function(x) {
    $.extend(result, {key_maker(x): val_maker(x)})
})
4b9b3361

Ответ 1

Предполагая, что a_list является массивом, ближайшим, вероятно, будет использовать .reduce().

var result = a_list.reduce(function(obj, x) {
    obj[key_maker(x)] = val_maker(x);
    return obj;
}, {});

Массивы, скорее всего, появятся в будущей версии JavaScript.


Вы можете адаптировать не совместимые с ES5 реализации с патчем совместимости с MDN.


Если a_list не является массивом, а является простым объектом, вы можете использовать Object.keys() для выполнения той же операции.

var result = Object.keys(a_list).reduce(function(obj, x) {
    obj[key_maker(a_list[x])] = val_maker(a_list[x]);
    return obj;
}, {});

Ответ 2

Старый вопрос, но ответ немного изменился в новых версиях Javascript. С ES2015 (ES6) вы можете достичь однострочного понимания объекта следующим образом:

a_list.reduce((obj, x) => Object.assign(obj, { [key_maker(x)]: value_maker(x) }), {})

Ответ 3

ES5 представил Map для OrderedDict. Понимание карты может выглядеть так:

Map( Array.map(function(o){return[ key_maker(o), val_maker(o) ]}))

Пример:

> a_list = [ {x:1}, {x:2}, {x:3} ]
< [ Object, Object, Object ]
>
> let dict = new Map(a_list.map(function(o){return[ o.x, o.x**2 ]}))
< Map[3]
< 0 : {1 => 1}
< 1 : {2 => 4}
< 2 : {3 => 9}
>
> dict.get(2)
< 4