In Javascript a dictionary comprehension, or an Object `map`

JavascriptJqueryPython

Javascript Problem Overview


I need to generate a couple of objects from lists in Javascript. In Python, I'd write this:

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

Another way to ask is does there exist something like jQuery.map() which aggregates objects? Here's my guess (doesn't work):

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

Javascript Solutions


Solution 1 - Javascript

Assuming a_list is an Array, the closest would probably be to use .reduce().

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

Array comprehensions are likely coming in a future version of JavaScript.


You can patch non ES5 compliant implementations with the compatibility patch from MDN.


If a_list is not an Array, but a plain object, you can use Object.keys() to perform the same operation.

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

Solution 2 - Javascript

Here's a version that doesn't use reduce:

Object.fromEntries( a_list.map( x => [key_maker(x), value_maker(x)]) );

Object.fromEntries is basically the same as _.fromPairs in Lodash. This feels the most like the Python dict comprehension to me.

Solution 3 - Javascript

Old question, but the answer has changed slightly in new versions of Javascript. With ES2015 (ES6) you can achieve a one-liner object comprehension like this:

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

Solution 4 - Javascript

ES5 introduced Map for an OrderedDict. A Map comprehension might look like:

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

Example:

> 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

Solution 5 - Javascript

Maybe something like this, using Lodash:

var result = _.fromPairs(a_list.map(x => [key_maker(x), value_maker(x)]));

Solution 6 - Javascript

A shorter ES6 version would be:

a_list.reduce((obj, x) => (obj[key_maker(x)] = val_maker(x), obj),{})

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionCuadueView Question on Stackoverflow
Solution 1 - Javascriptuser1106925View Answer on Stackoverflow
Solution 2 - Javascriptfizzyh2oView Answer on Stackoverflow
Solution 3 - JavascriptbenwixenView Answer on Stackoverflow
Solution 4 - JavascriptSteven AlmerothView Answer on Stackoverflow
Solution 5 - JavascriptElias ZamariaView Answer on Stackoverflow
Solution 6 - JavascriptsmartexpertView Answer on Stackoverflow