it-swarm.com.de

Wie konvertiert man JS Object in Array?

Ich muss eine Hash-Map konvertieren 

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

zu 

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

wie mache ich das??

33
Sam

Sie können es so machen (in einem funktionierenden Snippet):

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


Oder wenn Sie oder jemand anderes den Object-Prototyp um zahlbare Eigenschaften erweitert hat (was ich persönlich für eine schlechte Praxis halte), können Sie dies zum Schutz davor verwenden:

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


Und mit etwas moderneren Funktionen:

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 einem Browser, der ES5 unterstützt - oder wo Sie ein shim hinzugefügt haben:

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

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

Siehe: Object.keys , Arrays Map

Oder in alter Weise:

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

Bitte beachten Sie, dass in beiden Fällen der Wert des Arrays gemeinsam genutzt wird, da in JS die Objekte als Referenz übergeben werden. So zeigen stuff["fruit"] und array[0].name auf dieselbe Referenz des Arrays ["mango", "orange"]. Das bedeutet, wenn Sie eine davon ändern, wird auch die andere geändert:

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

Um dies zu vermeiden, können Sie slice verwenden, um eine tiefe Kopie des Arrays auf einer Ebene zu erhalten. Also im obigen Code anstelle von:

"name" : stuff[key]

du wirst haben:

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

Ich hoffe es hilft.

25
ZER0

Für diejenigen, die ES6-Karten verwenden ...

Vorausgesetzt, Sie haben ...

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

Sie können verwenden ...

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

Beachten Sie, dass Array.from sowohl iterierbare als auch arrayähnliche Objekte benötigt.

9
WoodenKitty

Ich möchte eine "Online" -Lösung geben:

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

Wortschatz zu Ihren Diensten. Frage, die gestellt wurde, um ein Objekt in ein Array zu übersetzen, also dupliziere ich nicht die Antwort, nicht wahr?

6
Roberto

Nicht genau die Antwort, die Sie suchen, aber sie kann für allgemeine Zwecke nützlich sein.

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

Es sieht einfach aus, der Schlüssel Ihrer Map ist type und die Werte sind Name.

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

ausgabe:

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

Wenn Sie Underscore.js verwenden: 

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