17

各チャネルにtrue/falseプロパティを持つ単一のオブジェクト(channelSettings)に変換したいチャネルの配列があります

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

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 ????;
});
4

3 に答える 3

28

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

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

        return obj;
}, {});

デモ:http: //jsfiddle.net/MjW9T/


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

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

于 2012-06-13T00:40:49.603 に答える
4

この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
}, {});

まあ、「am not i am」は私を打ち負かしますが、とにかく:
map配列を返すだけでなく、元の配列と同じ長さの配列のみを返します。これは、1つの配列の値を1:1で新しい配列に変換するためのものです。reduce「配列を単一の値に減らす」ことを意味します。したがって、ここでの使用。

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

MDNの詳細:

  1. マップ:https ://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/map
  2. 削減:https ://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/Reduce
于 2012-06-13T00:42:30.257 に答える
0

うーん..このような関数でラップするように見えます。

function toObject(arr) {
  var rv = {};
  for (var i = 0; i < arr.length; ++i)
    if (arr[i] !== undefined) rv[arr[i]] = true;
  return rv;
}
于 2012-06-13T00:38:34.380 に答える