ハッシュマップを変換する必要があります
{
"fruit" : ["mango","orange"],
"veg" : ["carrot"]
}
に
[
{ "type" : "fruit" , "name" : ["mango","orange"] } ,
{ "type" : "veg" , "name" : ["carrot"] }
]
それ、どうやったら出来るの??
ハッシュマップを変換する必要があります
{
"fruit" : ["mango","orange"],
"veg" : ["carrot"]
}
に
[
{ "type" : "fruit" , "name" : ["mango","orange"] } ,
{ "type" : "veg" , "name" : ["carrot"] }
]
それ、どうやったら出来るの??
あなたはこのようにそれを行うことができます(作業スニペットで):
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));
または、あなたまたは他の誰かがObject
列挙可能なプロパティを使用してプロトタイプを拡張している場合(個人的には悪い習慣だと思います)、これを使用してそれから保護することができます:
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));
そして、いくつかのより近代的な機能を使用します:
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));
ES5 をサポートするブラウザー、またはそのためのshimを追加した場所:
var stuff = {
"fruit" : ["mango","orange"],
"veg" : ["carrot"]
}
var array = Object.keys(stuff).map(function(key) {
return {"type" : key, "name" : stuff[key] }
})
参照: Object.keys、配列のマップ
または、昔ながらの方法で:
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] })
}
}
どちらの場合も、JS ではオブジェクトが参照によって渡されるため、配列の値が共有されることに注意してください。したがって、たとえば、stuff["fruit"]
andarray[0].name
は array の同じ参照を指します["mango", "orange"]
。つまり、一方を変更すると、もう一方も変更されます。
stuff["fruit"].push("apple");
alert(array[0].name); // "mango", "orange", "apple"
これを回避するには、sliceを使用して配列の 1 レベルのディープ コピーを作成します。したがって、上記のコードでは、次の代わりに:
"name" : stuff[key]
あなたが持っているでしょう:
"name" : stuff[key].slice(0)
それが役に立てば幸い。
「ワンライン」ソリューションを提供したいと思います:
var b = Object.keys(a).map(e => { return { type:e, name:a[e] } });
あなたのサービスで言葉の節約。オブジェクトを配列に変換するように求められたので、上記の回答と重複していませんか?
見た目はシンプルです。マップのキーはタイプで、値は名前です。したがって、マップをループしてオブジェクトをリストに挿入するだけです。
var d = { "fruit" : ["mango","orange"],"veg" :["carrot"]}
var l = []
for(var type in d){
l.push({'type':type, 'name': d[type]})
}
console.log(l)
出力:
[{"type":"fruit","name":["mango","orange"]},{"type":"veg","name":["carrot"]}]
探している答えとは異なりますが、一般的な目的には役立つ可能性があります。
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]
ループ不要
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()
]