42

ハッシュマップを変換する必要があります

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

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

それ、どうやったら出来るの??

4

8 に答える 8

43

あなたはこのようにそれを行うことができます(作業スニペットで):

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

于 2012-04-26T15:47:03.777 に答える
28

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)

それが役に立てば幸い。

于 2012-04-26T16:03:31.943 に答える
6

「ワンライン」ソリューションを提供したいと思います:

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

あなたのサービスで言葉の節約。オブジェクトを配列に変換するように求められたので、上記の回答と重複していませんか?

于 2016-05-22T22:55:15.600 に答える
1

見た目はシンプルです。マップのキーはタイプで、値は名前です。したがって、マップをループしてオブジェクトをリストに挿入するだけです。

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"]}]
于 2012-04-26T15:45:55.883 に答える
1

探している答えとは異なりますが、一般的な目的には役立つ可能性があります。

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]
于 2015-05-29T17:49:26.957 に答える
-1

ループ不要

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()   
]
于 2014-07-25T10:43:15.967 に答える