2012-04-26 5 views
23

Je dois convertir une carte de hachageconversion carte de hachage à un tableau

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

à

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

comment puis-je faire ??

+0

Je voudrais savoir comment le faire dans les deux sens .. – Sam

+0

s'il vous plaît, souvenez-vous de toujours fournir une indentation de code, il est plus facile de lire la question – fcalderan

+0

merci pour l'édition ... se souviendra de l'heure nxt .. – Sam

Répondre

26

Vous pouvez le faire comme ça (dans un extrait de travail):

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


Ou, si vous ou quelqu'un d'autre a été l'extension du prototype Object avec des propriétés dénombrables (qui je pense est une mauvaise pratique personnellement), alors vous pouvez l'utiliser pour protéger contre 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));


Et, en utilisant un peu plus fonctionnalité moderne:

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

Je suggère de vérifier 'hasOwnProperty' dans la boucle' for ... in'. –

+1

@Rocket Je ne suggère pas de vérifier hasOwnProperty à l'intérieur de la boucle for ... in. –

+0

@AnuragUniyal: Veuillez expliquer pourquoi. –

1

Cela semble simple, la clé de votre carte est le type et les valeurs sont le nom, donc juste une boucle à travers la carte et insérer l'objet dans une liste par exemple.

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

sortie:

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

comme une bonne pratique, il est préférable d'utiliser également la méthode '.hasOwnProperty()' – fcalderan

+1

@ F.Calderan pourquoi cela est nécessaire dans ce cas, lorsque le format est fixé carte? –

+0

@AnuragUniyal: Parce que sans 'hasOwnProperty', votre boucle' for ... in' lira les valeurs de la chaîne du prototype. Par exemple 'Object.prototype.test = 'test''. Votre boucle lira cette valeur, 'hasOwnProperty' vérifie pour voir si la valeur provient de l'objet lui-même, et non sa chaîne prototype. –

22

Dans un navigateur qui prend en charge ES5 - ou si vous avez ajouté un shim pour elle:

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

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

Voir: Object.keys, Array's map

Ou, à l'ancienne mode:

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] }) 
    } 
} 

Veuillez noter que dans les deux cas la valeur du tableau est partagée car dans JS les objets sont passés par référence. Ainsi, par exemple, stuff["fruit"] et array[0].name points à la même référence du tableau ["mango", "orange"]. Cela signifie, si vous changez un d'eux, l'autre sera changé ainsi:

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

Pour éviter cela, vous pouvez utiliser slice d'avoir une copie en profondeur d'un niveau de votre tableau. Ainsi, dans le code ci-dessus, au lieu de:

"name" : stuff[key] 

vous aurez:

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

Hope it helps.

+1

+1 pour 'map' :-) –

+0

Jamais vu Object.keys avant ... fonctionne très bien – afreeland

+0

+1 pour ES5 exemple – BradGreens

-1

Pas besoin de boucle

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

c'est ... bizarre. au moins réutiliser la fonction;) – drzaus

+0

pas une solution très extensible. Idem à drzaus. – fregas

1

Pas exactement la réponse que vous cherchez, mais il pourrait être utile à des fins générales.

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

Je voudrais donner une solution "oneline":

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

économie de mots à votre service. Question posée pour traduire un objet dans un tableau, donc je ne duplique pas la réponse ci-dessus, n'est-ce pas?

6

Pour ceux qui utilisent des cartes ES6 ...

En supposant que vous avez ...

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

Vous pouvez utiliser ...

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

Notez que Array.from iterables prend ainsi comme des objets de type tableau.

0

En cas d'utilisation underscore.js:

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