web-dev-qa-db-ja.com

JSオブジェクトを配列に変換する方法

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

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

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

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

36
Sam

このようにすることができます(作業スニペットで):

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

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"]およびarray[0].nameは、配列["mango", "orange"]の同じ参照を指します。つまり、どちらかを変更すると、もう一方も変更されます。

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

これを回避するには、 slice を使用して、アレイの1レベルの深いコピーを作成します。したがって、上記のコードでは、次の代わりに:

"name" : stuff[key]

あなたが持っています:

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

それが役に立てば幸い。

25
ZER0

ES6マップを使用している場合...

あなたが持っていると仮定...

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

使用できます...

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

Array.from は反復可能なオブジェクトと配列のようなオブジェクトを取ります。

9
WoodenKitty

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

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

あなたのサービスで言葉の経済。オブジェクトを配列に変換するように質問されたので、上記の答えを複製していませんか?

6
Roberto

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

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

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

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"]}]
1
Anurag Uniyal

Underscore.jsを使用する場合:

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