在Javascript中的字典理解,或对象`map`

Cua*_*due 50 javascript python jquery

我需要从Javascript中的列表生成几个对象.在Python中,我写这个:

{key_maker(x): val_maker(x) for x in a_list}
Run Code Online (Sandbox Code Playgroud)

另一种问题是,是否存在jQuery.map()聚合对象?这是我的猜测(不起作用):

var result = {}
$.map(a_list, function(x) {
    $.extend(result, {key_maker(x): val_maker(x)})
})
Run Code Online (Sandbox Code Playgroud)

小智 41

假设a_list是一个数组,最接近可能是使用.reduce().

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

数组理解可能会出现在JavaScript的未来版本中.


您可以使用MDN兼容性修补程序修补非ES5兼容的实现.


如果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;
}, {});
Run Code Online (Sandbox Code Playgroud)

  • 使用下划线或lodash,它将是:`_.reduce(a_list,function(obj,x){...},{});` (3认同)

fiz*_*h2o 14

这是一个不使用reduce的版本:

Object.fromEntries( a_list.map( x => [key_maker(x), value_maker(x)]) );
Run Code Online (Sandbox Code Playgroud)

Object.fromEntriesLodash中的_.fromPairs 基本相同。这让我感觉最像Python dict理解。

  • 没有特殊语法IMO,我们就可以更接近理解,尽管截至2019年1月,这仍然是一项提案,尚未在NodeJS中实现。 (2认同)

ben*_*xen 5

旧问题,但是答案在新版本的Javascript中略有变化。使用ES2015(ES6),您可以像这样实现单线对象理解:

a_list.reduce((obj, x) => Object.assign(obj, { [key_maker(x)]: value_maker(x) }), {})
Run Code Online (Sandbox Code Playgroud)


Ste*_*oth 5

ES5MapOrderedDict引入。地图理解可能如下所示:

Map( Array.map(function(o){return[ key_maker(o), val_maker(o) ]}))
Run Code Online (Sandbox Code Playgroud)

例子:

> 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
Run Code Online (Sandbox Code Playgroud)


Eli*_*ria 5

使用Lodash可能是这样的: var result = _.fromPairs(a_list.map(x => [key_maker(x), value_maker(x)]));