it-swarm-eu.dev

Come convertire JS Object in Array

Devo convertire una mappa hash 

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

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

come lo faccio??

33
Sam

Puoi farlo in questo modo (in uno snippet di lavoro):

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


Oppure, se tu o qualcun altro hai esteso il prototipo Object con proprietà enumerabili (che ritengo sia una cattiva pratica personale), allora potresti usare questo per proteggerlo da:

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


E, usando alcune funzionalità più 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));

31
jfriend00

In un browser che supporta ES5 - o dove hai aggiunto uno shim per questo:

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

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

Vedi: Object.keys , Mappa dell'array

Oppure, nel vecchio modo:

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

Si noti che in entrambi i casi il valore dell'array è condiviso perché in JS gli oggetti vengono passati per riferimento. Ad esempio, stuff["fruit"] e array[0].name puntano allo stesso riferimento dell'array ["mango", "orange"]. Significa che se si cambia uno di essi, anche l'altro verrà modificato:

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

Per evitare ciò, è possibile utilizzare slice per avere una copia profonda di un livello dell'array. Quindi nel codice sopra, invece di:

"name" : stuff[key]

tu avrai:

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

Spero che sia d'aiuto.

25
ZER0

Per chi usa le mappe ES6 ...

Supponendo che tu abbia ...

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

Puoi usare...

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

Nota che Array.from prende iterabili così come oggetti tipo array.

9
WoodenKitty

Non è esattamente la risposta che stai cercando, ma potrebbe essere utile per scopi generali.

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

Sembra semplice, la chiave della tua mappa è di tipo e i valori sono i nomi, quindi basta eseguire il ciclo attraverso la mappa e inserire l'oggetto in un elenco, ad es.

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

produzione:

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

In caso di utilizzo di underscore.js: 

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