2012-06-13 16 views
8

Mam wachlarz kanałów, że chcą przekształcić w pojedynczy obiekt (channelSettings) z true/false własności dla każdego kanału.jak zbudować obiekt javascript za pomocą tablicy i funkcji mapy?

Mam to działa przy użyciu poniższego kodu, ale wydaje się być verbose. Czy jest sposób, aby to zrobić bez "temp" var? Jeśli uda mi się jeździć, będę mógł również skorzystać z funkcji wykonywania poleceń.

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; 
}(); 

Zgaduję, że próbuję uzyskać funkcję map, aby zwrócić obiekt z właściwościami zamiast tablicy. czy to możliwe? Czy jest źle kierowany? Propozycje?

To, co mam nadzieję, że to wygląda jak w końcu:

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

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

może być nieco rozwlekły, ale jest to również _clear_. Głosowałbym, aby zostawić to takim, jakie jest. –

Odpowiedz

7

Zamiast tego należy użyć funkcji .reduce().

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

     return obj; 
}, {}); 

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


Pierwszy parametr odwołuje wcześniej zwrócony elementu, za wyjątkiem pierwszej iteracji, gdzie jest wykorzystywana zarówno z pierwszej pozycji w tablicy lub Zaszczepiony element, który dostarczyliśmy jako pusty obiekt.

Drugi parametr odnosi się do bieżącej wartości w Tablicy. Dopóki zawsze zwracamy obj, pierwszym parametrem będzie zawsze ten obiekt, podobnie jak ostateczna wartość zwracana.

+0

Ładne wyjaśnienie, Thx! – DanielEli

+0

@DanielEli: Nie ma za co. –

0

hmm .. wygląda owijając go w funkcji jak byłoby to zrobić.

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

Funkcja map pobiera tablicę i zwraca tablicę. Nic więcej. Ale można użyć 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 
}, {}); 

Cóż, „ja nie jestem” beat mnie do niej, ale w każdym razie:
map zwraca nie tylko tablice, ale także zwraca tylko tablice o tej samej długości, co oryginał. Jest przeznaczony do przekształcenia wartości jednej tablicy 1: 1 w nową tablicę. reduce służy do "zmniejszenia tablicy do pojedynczej wartości". Stąd jego użycie tutaj.

Jeśli używasz prostej pętli lub metody forEach do dodawania właściwości do obiektu, musisz zadeklarować ten obiekt. Tak więc nie, nie można obejść się bez kodu temp (chyba że używa się reduce zamiast pętli).

Więcej informacji o MDN:

  1. mapa: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/map
  2. zmniejszyć: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/Reduce
+0

i tutaj również doskonałe wyjaśnienie! (Nie będę musiał bronić mojej zielonej determinacji w sądzie ..) wiele razy! – DanielEli

+0

@RobG Ah, linki MDN - zupełnie zapomniałem dodać. Dzięki za edycję – Flambino

+0

skończyło się na zastosowaniu bardziej przejrzystej wersji. klawisz var = item.toLowerCase(). Replace ("", ""); obj [key] = false; return obj – DanielEli

Powiązane problemy