web-dev-qa-db-ja.com

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)})
})
_
53
Cuadue

_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;
}, {});
_
36
user1106925

以下は、reduceを使用しないバージョンです。

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

Object.fromEntries は、Lodashの _。fromPairs と基本的に同じです。これは、Python dict理解力に最も似ていると感じます。

8
fizzyh2o

Lodash を使用して、おそらくこのようなものです:var result = _.fromPairs(a_list.map(x => [key_maker(x), value_maker(x)]));

5
Elias Zamaria

ES5 導入されたMapOrderedDictの場合。マップの内包は次のようになります。

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
4
Steven Almeroth

古い質問ですが、Javascriptの新しいバージョンでは答えが少し変わりました。 ES2015(ES6)を使用すると、次のような1行のオブジェクト理解を実現できます。

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

より短いES6バージョンは次のようになります。

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