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

前端 未结 6 1387
青春惊慌失措
青春惊慌失措 2020-12-28 13:01

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}

A

相关标签:
6条回答
  • 2020-12-28 13:10

    Maybe something like this, using Lodash: var result = _.fromPairs(a_list.map(x => [key_maker(x), value_maker(x)]));

    0 讨论(0)
  • 2020-12-28 13:14

    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) }), {})
    
    0 讨论(0)
  • 2020-12-28 13:27

    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;
    }, {});
    
    0 讨论(0)
  • 2020-12-28 13:27

    A shorter ES6 version would be:

    a_list.reduce((obj, x) => (key_maker(obj[x]) = val_maker(x), obj),{})
    
    0 讨论(0)
  • 2020-12-28 13:30

    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.

    0 讨论(0)
  • 2020-12-28 13:30

    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
    
    0 讨论(0)
提交回复
热议问题