2012-06-13 10 views
8

Tengo una gran variedad de canales que desea transformar en un solo objeto (channelSettings) con un verdadero falso propiedad/ para cada canal.cómo construir un objeto javascript utilizando una matriz y la función de mapa?

Lo tengo trabajando usando el siguiente código pero parece detallado. ¿Hay forma de hacerlo sin la var "temperatura"? Si puedo sacarme de eso, entonces también podría obtener la función autoejecutable.

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

Supongo que estoy tratando de obtener la función de mapa para devolver un objeto con propiedades en lugar de una matriz. es posible? ¿Está mal guiado? Sugerencias?

Esto es lo que estoy esperando que se ve como en el final:

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

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

Puede ser un poco prolijo, pero también es _clear_. Yo votaría para dejarlo tal como está. –

Respuesta

7

Utilice una función .reduce() en su lugar.

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

     return obj; 
}, {}); 

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


El primer parámetro hace referencia el artículo devuelto anteriormente, a excepción de la primera iteración, donde se hace referencia a ya sea el primer elemento de la matriz, o de la cabeza de serie artículo, que proporcionamos como un objeto vacío.

El segundo parámetro hace referencia al valor actual en la matriz. Siempre que siempre devolvamos obj, el primer parámetro siempre será ese objeto, al igual que el valor de retorno final.

+0

¡Buena explicación, Thx! – DanielEli

+0

@DanielEli: De nada. –

0

hmm .. que parece envolverlo en una función como esta lo haría.

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

La función map toma una matriz y devuelve una matriz. Nada más. Pero se puede usar 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 
}, {}); 

Bueno, "no soy yo soy" se me adelantó, pero de todos modos:
map no sólo devuelve matrices, sino solamente devuelve matrices de la misma longitud que la original. Está destinado a transformar los valores de una matriz de 1: 1 en una nueva matriz. reduce está destinado a "reducir una matriz a un solo valor". De ahí su uso aquí.

Si utiliza un bucle for recto o el método forEach para agregar propiedades a un objeto, no necesita declarar ese objeto. Entonces, no, no puede prescindir de temp en su código (a menos que use reduce en lugar de un bucle).

Más información sobre MDN:

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

y una excelente explicación aquí también! (No tendría que defender mi determinación de verificación verde en la corte ...) ¡muchas gracias! – DanielEli

+0

@RobG Ah, enlaces de MDN: olvidé por completo agregar esos. Gracias por la edición – Flambino

+0

Terminé usando una versión más clara. var clave = item.toLowerCase(). Replace ("", ""); obj [clave] = falso; return obj – DanielEli

Cuestiones relacionadas