2012-04-26 26 views
23

Necesito convertir un mapa hashconvertir mapa hash a la matriz

{ 
    "fruit" : ["mango","orange"], 
    "veg" : ["carrot"] 
} 

a

[ 
    { "type" : "fruit" , "name" : ["mango","orange"] } , 
    { "type" : "veg" , "name" : ["carrot"] } 
] 

cómo hago eso ??

+0

me gustaría saber cómo hacer las dos cosas .. – Sam

+0

favor, recuerde proporcionar siempre un cierto código identation, se hace la pregunta más fácil de leer – fcalderan

+0

gracias por la edición ... lo recordará en tiempo nxt .. – Sam

Respuesta

26

Usted puede hacerlo de esta manera (en un fragmento de trabajo):

var input = { 
 
    "fruit" : ["mango","orange"], 
 
    "veg" : ["carrot"] 
 
} 
 

 
var output = [], item; 
 

 
for (var type in input) { 
 
    item = {}; 
 
    item.type = type; 
 
    item.name = input[type]; 
 
    output.push(item); 
 
} 
 

 
// display result 
 
document.write(JSON.stringify(output));


O, si usted o alguien más tiene ido extendiendo el prototipo Object con propiedades enumerables (que creo que es una mala práctica personal), entonces se podría usar esto para protegerlo de que:

var input = { 
 
    "fruit" : ["mango","orange"], 
 
    "veg" : ["carrot"] 
 
} 
 

 
var output = [], item; 
 

 
for (var type in input) { 
 
    if (input.hasOwnProperty(type)) { 
 
     item = {}; 
 
     item.type = type; 
 
     item.name = input[type]; 
 
     output.push(item); 
 
    } 
 
} 
 

 
// display result 
 
document.write(JSON.stringify(output));


Y, con un poco más de funcionalidad moderna:

var input = { 
 
    "fruit" : ["mango","orange"], 
 
    "veg" : ["carrot"] 
 
}; 
 

 
var output = Object.keys(input).map(function(key) { 
 
    return {type: key, name: input[key]}; 
 
}); 
 

 
// display the result 
 
document.write(JSON.stringify(output));

+2

Sugiero verificar 'hasOwnProperty' dentro del bucle' for ... in'. –

+1

@Rocket NO sugiero verificar hasOwnProperty dentro del ciclo for ... in. –

+0

@AnuragUniyal: explique por qué. –

1

Parece simple, la clave de su mapa es el tipo y los valores son el nombre, de modo que solo ingrese un bucle a través del mapa e inserte el objeto en una lista, p.

var d = { "fruit" : ["mango","orange"],"veg" :["carrot"]} 
var l = [] 
for(var type in d){ 
    l.push({'type':type, 'name': d[type]}) 
} 
console.log(l) 

de salida:

[{"type":"fruit","name":["mango","orange"]},{"type":"veg","name":["carrot"]}] 
+1

como una buena práctica, es mejor usar también el método '.hasOwnProperty()' – fcalderan

+1

@ F.Calderan ¿por qué es necesario en este caso, cuando el formato es un mapa fijo? –

+0

@AnuragUniyal: Porque sin 'hasOwnProperty', su bucle' for ... in' leerá valores de la cadena del prototipo. Por ejemplo 'Object.prototype.test = 'test''. Su ciclo leerá este valor, las comprobaciones 'hasOwnProperty' para ver si el valor proviene del objeto en sí y no de su cadena de prototipos. –

22

En un navegador que soporte ES5 - o donde usted agregó un shim para ello:

var stuff = { 
    "fruit" : ["mango","orange"], 
    "veg" : ["carrot"] 
} 

var array = Object.keys(stuff).map(function(key) { 
    return {"type" : key, "name" : stuff[key] } 
}) 

Ver: Object.keys, Array's map

O, en la manera antigua:

var stuff = { 
    "fruit" : ["mango","orange"], 
    "veg" : ["carrot"] 
} 

var array = [] 

for (var key in stuff) { 
    if (stuff.hasOwnProperty(key)) { 
     array.push({"type" : key, "name" : stuff[key] }) 
    } 
} 

Tenga en cuenta que en ambos casos el valor de la matriz se comparte porque en JS los objetos se pasan por referencia. Por lo tanto, por ejemplo, stuff["fruit"] y array[0].name apunta a la misma referencia de la matriz ["mango", "orange"]. Es decir, si se cambia uno de ellos, el otro se cambiará así:

stuff["fruit"].push("apple"); 
alert(array[0].name); // "mango", "orange", "apple" 

Para evitar esto, se puede utilizar slice tener una copia profunda de un nivel de la matriz. Así que en el código anterior, en lugar de:

"name" : stuff[key] 

tendrá:

"name" : stuff[key].slice(0) 

espero que ayude.

+1

1 para 'map' :-) –

+0

Nunca antes visto Object.keys ... funciona muy bien para – afreeland

+0

1 ES5 ejemplo – BradGreens

-1

No hay necesidad de bucle

var a = { 
    "fruit" : ["mango","orange"],  
    "veg" : ["carrot"] 


}; 

var b = [ 
    { "type" : "fruit" , "pop" : function(){this.name = a[this.type]; delete this.pop; return this} }.pop() ,   
    { "type" : "veg" , "pop" : function(){this.name = a[this.type]; delete this.pop; return this} }.pop() 
] 
+0

que es ... extraño. al menos reutilizar la función;) – drzaus

+0

no es una solución muy extensible. Ídem a drzaus. – fregas

1

No es exactamente la respuesta que está buscando, pero podría ser útil para fines generales.

var hash2Array = function(hash, valueOnly) { 
    return Object.keys(hash).map(function(k) { 
    if (valueOnly) { 
     return hash[k]; 
    } else { 
     var obj={}; 
     obj[k] = hash[k]; 
     return obj; 
    } 
    }); 
}; 

//output 
hash2Array({a:1, b:2});  // [{a:1}, {b:2}] 
hash2Array({a:1, b:2},true) // [1,2] 
4

me gustaría dar una solución "oneline":

var b = Object.keys(a).map(e => { return { type:e, name:a[e] } }); 

economía de palabras a su servicio. Pregunta para traducir un objeto a una matriz, por lo que no estoy duplicando la respuesta anterior, ¿no?

6

Para aquellos que utilizan mapas ES6 ...

Asumiendo que tiene ...

const m = new Map() 
m.set("fruit",["mango","orange"]); 
m.set("veg",["carrot"]); 

Se puede utilizar ...

const arr = Array.from(map, ([key, val]) => { 
    return {type: key, name: val}; 
}); 

Tenga en cuenta que Array.from toma así iterables como objetos tipo array.

0

En caso de utilizar underscore.js:

var original = { 
    "fruit" : ["mango","orange"], 
    "veg" : ["carrot"] 
} 
var converted = _.map(original, function(name, type){ 
    return { 
     type: type, 
     name: name 
    }; 
});