2012-01-05 11 views
6

¿Hay una manera simple en javascript de tomar una matriz plana y convertirla en un objeto con los miembros pares indexados como propiedades y miembros con índice impar como valores correspondientes (análoga a Ruby's Hash[*array])?Convertir matriz plana [k1, v1, k2, v2] al objeto {k1: v1, k2: v2} en JavaScript?

Por ejemplo, si tengo esto:

[ 'a', 'b', 'c', 'd', 'e', 'f' ] 

entonces yo quiero esto:

{ 'a': 'b', 'c': 'd', 'e': 'f' } 

El mejor que he encontrado hasta el momento parece más detallado de lo que tiene que ser:

var arr = [ 'a', 'b', 'c', 'd', 'e', 'f' ]; 
var obj = {}; 
for (var i = 0, len = arr.length; i < len; i += 2) { 
    obj[arr[i]] = arr[i + 1]; 
} 
// obj => { 'a': 'b', 'c': 'd', 'e': 'f' } 

¿Hay alguna manera mejor, menos detallada o más elegante de hacer esto? (¿O acabo de programar en ruby ​​demasiado últimamente?)

Estoy buscando una respuesta en Javascript de vanilla, pero también estaría interesado si hay una manera mejor de hacerlo si se usa undercore.js o jQuery. El rendimiento no es realmente una preocupación.

+4

Usted puede crear su propia función, entonces es bastante corta: 'var obj = transformar (arr); ';) –

+0

Eso me parece bastante conciso. – ChaosPandion

+0

Lo tienes bien. El ciclo que proporcionó es la forma correcta de hacerlo. –

Respuesta

8

Bastante seguro de que esto funciona y es más corto:

var arr = [ 'a', 'b', 'c', 'd', 'e', 'f' ]; 
var obj = {}; 
while (arr.length) { 
    obj[arr.shift()] = arr.shift(); 
} 

Ver shift().

+0

Sin garantías de velocidad, sin embargo. – paislee

+3

¡Me gusta esto! Pero probablemente debas notar como una advertencia que esto consume la matriz original, por lo que solo funciona si no te importa el original. –

+0

@pst thx, me lo ganaste – paislee

4
var arr = [ 'a', 'b', 'c', 'd', 'e', 'f' ]; 
var obj = arr.reduce(function(ret, value, i, values) { 

    if(i % 2 === 0) ret[ value ] = values[ i + 1 ]; 
    return ret; 

}, { }); 
0

Si lo necesita varias veces también se puede añadir un método para la Array.prototype:

Array.prototype.to_object = function() { 
    var obj = {}; 
    for(var i = 0; i < this.length; i += 2) { 
    obj[this[i]] = this[i + 1]; 
    } 
    return obj 
}; 

var a = [ 'a', 'b', 'c', 'd', 'e', 'f' ]; 

a.to_object(); // => { 'a': 'b', 'c': 'd', 'e': 'f' } 
Cuestiones relacionadas