web-dev-qa-db-fra.com

Comment convertir un objet JS en tableau

J'ai besoin de convertir une carte de hachage 

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

à 

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

comment je fais ça??

33
Sam

Vous pouvez le faire comme ceci (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 étiez le prototype Object avec des propriétés énumérables (ce qui, à mon avis, est une mauvaise pratique), vous pouvez l'utiliser pour se protéger:

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 des fonctionnalités plus modernes:

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

31
jfriend00

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

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

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

Voir: Object.keys , Carte de tableau

Ou, à l'ancienne:

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

Notez 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 désignent la même référence que le tableau ["mango", "orange"]. Cela signifie que si vous changez l'un d'entre eux, l'autre changera également:

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

Pour éviter cela, vous pouvez utiliser slice pour obtenir une copie complète à un niveau de votre tableau. Donc dans le code ci-dessus, au lieu de:

"name" : stuff[key]

tu vas avoir:

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

J'espère que ça aide.

25
ZER0

Pour ceux qui utilisent les 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 prend des iterables ainsi que des objets de type tableau.

9
WoodenKitty

Je voudrais donner une solution "en ligne":

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

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

6
Roberto

Pas exactement la réponse que vous recherchez, mais cela 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]
1
allenhwkim

Cela a l'air simple, la clé de votre carte est le type et les valeurs sont le nom, il suffit donc de parcourir la carte et d'insérer un 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
Anurag Uniyal

En cas d'utilisation de underscore.js: 

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