我需要转换一个哈希表
{
"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浏览器-或者你加了垫片吧:
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)
希望能帮助到你。
对于使用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以及阵列状物体。
我想给一个“ONELINE”的解决方案:
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]
在使用underscore.js的情况下:
var original = {
"fruit" : ["mango","orange"],
"veg" : ["carrot"]
}
var converted = _.map(original, function(name, type){
return {
type: type,
name: name
};
});
循环没有需要
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()
]