如何JS对象转换为数组(How to convert JS Object to Array)

2019-06-24 00:14发布

我需要转换一个哈希表

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

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

我怎么做??

Answer 1:

你可以像下面这样做(在工作片段):

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



Answer 2:

在支持ES5浏览器-或者你加了垫片吧:

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

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

请参阅: Object.keys , Array的地图

或者,在老式的方法:

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"

为了避免这种情况,你可以用切片有你的阵列的一个层次的深层复制。 因此,在上面的代码,而不是:

"name" : stuff[key]

你将会有:

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

希望能帮助到你。



Answer 3:

对于使用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需要iterables以及阵列状物体。



Answer 4:

我想给一个“ONELINE”的解决方案:

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

为您服务的话经济。 问题问翻译的对象数组,所以我不回答上面复制的,不是吗?



Answer 5:

它看起来很简单,你的地图的关键是类型和值的名称,所以只环通地图,并在列表中插入例如对象

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


Answer 6:

不完全回答你正在寻找,但它可能是用于一般目的。

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]


Answer 7:

在使用underscore.js的情况下:

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


Answer 8:

循环没有需要

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


文章来源: How to convert JS Object to Array