2

Javascriptを使用してキーと値を配列にマッピングする方法はありますか? 私の意見では、これは jQuery.map()に似ていますが、値のみをマッピングするのではなく、キーも「マッピング」します。

次の配列があるとします。

var names = [ 1, 2, 3, 4, 5 ];

そして、私が作成したという関数を使用して、numberToName()これから別の配列を生成するのが好きで、結果は次のようになります。

var names = { "one": 1, "two": 2, "three": 3, "four": 4, "five": 5 };

現在、私は次の方法を使用しています。

var names = [ 1, 2, 3, 4, 5 ],
    names_tmp = {},
    names_i = 0,
    names_len = names.length;

for(; names_i < names_len; names_i++) {
    names_tmp[numberToName(names[names_i])] = names[names_i];
}

問題は、この方法を改善する方法 (できればネイティブ) はありますか? jQueryも問題なく使えました。おそらくこれに似た機能:

var names = jQuery.mapKeys([ 1, 2, 3, 4, 5], function(k, v) {
    return { key: numberToName(v), value: v };
});
4

2 に答える 2

5

あなたが探しているreduce

var names = [1, 2, 3, 4, 5].reduce(function(obj, k) {
     return obj[numberToName(k)] = k, obj;
}, {});

return obj[numberToName(k)] = k, obj代入 + リターンを書く省略形の (そして確かに読みにくい) 方法です。

     obj[numberToName(k)] = k;
     return obj;

シンプルforEachでも仕事をします:

names = {};
[1, 2, 3, 4, 5].forEach(function(k) {
   names[numberToName(k)] = k
})

必要に応じて、 jquery も$.each同じように使用できます。

于 2013-07-31T21:12:29.340 に答える
1

確かに、(IE9の時点で):

var nums={};
[ 1, 2, 3, 4, 5].forEach(function(v, i) {
    this[numberToName(v)]=v; 
}, nums);

nums;

編集:何が起こっているのかを簡単に伝えるためにインデックスを追加しました。

編集: forEach を使用して完璧にしました。$ の .map() ほどではありませんが、[].map よりも約 3% 高速に実行されます。(thg435 のヒントに感謝します!)

于 2013-07-31T21:11:50.920 に答える