在Javascript中是一个字典解析,或者是一个对象Map

ih99xse1  于 2023-01-01  发布在  Java
关注(0)|答案(7)|浏览(111)

我需要用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)})
})
jc3wubiy

jc3wubiy1#

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

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

Object.fromEntries与Lodash中的_.fromPairs基本相同,这感觉最像Python的dict理解。

5sxhfpxr

5sxhfpxr2#

假设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;
}, {});
hivapdat

hivapdat3#

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

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

g6ll5ycj4#

ES5为 * OrderedDict * 引入了Map。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
vmjh9lq9

vmjh9lq95#

也许是这样的,使用Lodash:第一个月

8wtpewkr

8wtpewkr6#

较短的ES6版本为:

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

yqkkidmi7#

我使用的是最新版本的 typescript ,我使用

const list = [1, 2, 3, ...];
const obj = Object.fromEntries(array.map(val, idx) => [func1(val), func2(val)]))
// python equivalent: {func1(x): func2(x) for x in a_list}

相关问题