79

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

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

另一种方法是问是否存在诸如jQuery.map()which 聚合对象之类的东西?这是我的猜测(不起作用):

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

6 回答 6

58

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

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

数组推导可能会出现在 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;
}, {});
于 2012-06-17T01:29:00.950 回答
52

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

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

Object.fromEntries与Lodash中的 _.fromPairs基本相同。这对我来说最像 Python dict 理解。

于 2018-11-27T21:13:17.390 回答
8

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

a_list.reduce((obj, x) => Object.assign(obj, { [key_maker(x)]: value_maker(x) }), {})
于 2016-10-11T10:30:58.753 回答
5

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

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
于 2016-12-09T03:53:33.723 回答
5

也许像这样,使用Lodash var result = _.fromPairs(a_list.map(x => [key_maker(x), value_maker(x)]));

于 2018-04-17T04:24:04.673 回答
4

更短的 ES6 版本是:

a_list.reduce((obj, x) => (obj[key_maker(x)] = val_maker(x), obj),{})
于 2018-08-29T15:04:11.170 回答