2012-06-13 6 views
8

私は、各チャネルのために真/偽プロパティで単一のオブジェクト(channelSettings)に変換したいチャンネル配列を持っています。配列とマップ関数を使用してjavascriptオブジェクトを構築する方法は?

私は以下のコードを使って動作させていますが、冗長であるようです。 "temp" varなしでそれを行う方法はありますか?私がそれを乗り越えることができれば、自己実行機能にも乗ることができます。

var channels = ["TV", "Billboard", "Spot TV"]; 


var channelSettings = function() { 
    var temp = {}; 

    channels.map(function(itm, i, a) { 
     var channel = itm.toLowerCase().replace(" ", ""); 
     temp[channel] = false; 
    }); 

    return temp; 
}(); 

私はmap関数が配列の代わりにプロパティを持つオブジェクトを返すようにしようとしていると思います。これは可能ですか?それは誤ってガイドされていますか?提案?

これは、私はそれが最後のように見える望んでいるものです:

var channels = ["TV", "Billboard", "Spot TV"]; 

var channelSettings = channels.map(function(itm, i, a) { 
     var channel = itm.toLowerCase().replace(" ", ""); 
     return ????; 
}); 
+1

をそれは少し冗長かもしれないが、それも_clear_です。私はそれをそのまま残すことに投票します。 –

答えて

7

代わりに.reduce()関数を使用してください。

var channelSettings = channels.reduce(function(obj, itm) { 
     var channel = itm.toLowerCase().replace(" ", ""); 
     obj[channel] = false; 

     return obj; 
}, {}); 

DEMO:http://jsfiddle.net/MjW9T/


最初のパラメータは、それが配列の最初の項目のいずれかを参照する最初の反復、または播種を除いて、以前に返されたアイテムを参照これは空のオブジェクトとして提供されています。

第2パラメータは、配列の現在の値を参照します。常にobjを返す限り、最初のパラメータは常にそのオブジェクトであり、最終的な戻り値も同じです。

+0

いい説明、Thx! – DanielEli

+0

@DanielEli:どうぞよろしくお願いいたします。 –

0

うーん...それを行うだろう。このような関数でそれを包むように見えます。

function toObject(arr) { 
    var rv = {}; 
    for (var i = 0; i < arr.length; ++i) 
    if (arr[i] !== undefined) rv[arr[i]] = true; 
    return rv; 
} 
3

map関数は配列をとり、配列を返します。他に何もない。しかし、あなたはreduceを使用することができます:まあ

var settings = ["TV", "Billboard", "Spot TV"].reduce(function(obj, item) { 
    obj[item.toLowerCase().replace(" ", "")] = false; // probably too concise 
    return obj // yay, we can skip a semi-colon here :-P 
}, {}); 

、とにかくそれに私を打つが、「私はないです」:
mapは配列を返しますが、また、唯一のオリジナルと同じ長さの配列を返すだけではなく。これは、1つの配列の値1:1を新しい配列に変換するためのものです。 reduceは、「配列を単一の値に減らす」ためのものです。したがって、ここでその使用。

ストレートforループまたはforEachメソッドを使用してオブジェクトにプロパティを追加する場合は、そのオブジェクトを宣言する必要があります。ループの代わりにreduceを使用しない限り、コード内にtempなしで行うことはできません。

  1. マップ:MDNの情報が

    もっとhttps://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/map

  2. 削減:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/Reduce
+0

とここでも優れた説明があります! (私は裁判所で私の緑の小切手の決定を守る必要はありません..)多くのthx! – DanielEli

+0

@RobGああ、MDNリンク - 私はそれらを追加することを完全に忘れてしまった。編集ありがとう – Flambino

+0

私はより明確なバージョンを使用して終了しました。 var key = item.toLowerCase()。replace( ""、 ""); obj [key] = false; 返品obj – DanielEli

関連する問題