2012-06-13 94 views
8

我有一個陣列通道,我想用一個真/假屬性轉變成一個單個對象(channelSettings)針對每個信道的如何使用數組和map函數構建javascript對象?

我已經使用下面的代碼工作,但它似乎冗長。有沒有辦法做到沒有「臨時」變種?如果我能得到那個,那麼我也可以騎自行車功能。

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/


第一個參數引用先前返回的項目,除了對於第一次迭代,在那裏它在數組引用所述第一項,或接種項目,我們提供了一個空對象。

第二個參數引用數組中的當前值。只要我們總是返回obj,第一個參數將始終是該對象,最終返回值也是如此。

+0

很好的解釋,Thx! – DanielEli

+0

@DanielEli:不客氣。 – 2012-06-13 00:48:35

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轉換爲新的數組。 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
+0

,這裏也有很好的解釋! (我不必在法庭上捍衛我的綠色檢查決心..)很多thx! – DanielEli

+0

@RobG啊,MDN鏈接 - 我完全忘了添加這些。感謝編輯 – Flambino

+0

我最終使用了更清晰的版本。 var key = item.toLowerCase()。replace(「」,「」); obj [key] = false; return obj – DanielEli

相關問題