在 Javascript 中是字典理解,或者是对象“映射”

我需要从 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)})
})
33784 次浏览

假设 a_list是一个 Array,最接近的方法可能是使用 .reduce()

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

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


您可以用 来自 MDN 的兼容性补丁修补不符合 ES5的实现。


如果 a_list不是 Array,而是普通对象,则可以使用 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;
}, {});

这是个老问题,但是在 Javascript 的新版本中,答案稍有改变。使用 ES2015(ES6) ,您可以像下面这样实现一行对象理解:

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

ES5 命令引入了 Map。地图理解可能看起来像:

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

也许像这样,使用 Lodash: Var result = _. from Pair (a _ list. map (x = > [ key _ maker (x) ,value _ maker (x)]) ;

较短的 ES6版本如下:

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

下面是一个不使用 reduce 的版本:

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

根据条目 ,它与 Lodash 的 来自巴黎基本相同。对我来说,这感觉最像 Python 的字典理解。