79

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)})
})
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の将来のバージョンで提供される可能性があります。


ES5に準拠していない実装には、MDNの互換性パッチを適用できます。


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 に答える
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

OrderedDictに導入さMapれた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
于 2016-12-09T03:53:33.723 に答える