我需要转换哈希映射
{
"fruit" : ["mango","orange"],
"veg" : ["carrot"]
}
到
[
{ "type" : "fruit" , "name" : ["mango","orange"] } ,
{ "type" : "veg" , "name" : ["carrot"] }
]
我该怎么做?
答案 0 :(得分:33)
你可以这样做(在一个工作片段中):
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));
答案 1 :(得分:25)
在支持ES5的浏览器中 - 或者为其添加shim的位置:
var stuff = {
"fruit" : ["mango","orange"],
"veg" : ["carrot"]
}
var array = Object.keys(stuff).map(function(key) {
return {"type" : key, "name" : stuff[key] }
})
或者,以旧时尚的方式:
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获得数组的一级深层副本。所以在上面的代码中,而不是:
"name" : stuff[key]
你将拥有:
"name" : stuff[key].slice(0)
希望它有所帮助。
答案 2 :(得分:9)
对于那些使用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和类似数组的对象。
答案 3 :(得分:6)
我想给一个" oneline"溶液:
var b = Object.keys(a).map(e => { return { type:e, name:a[e] } });
为您服务的话语经济。问题要求将一个对象翻译成一个数组,所以我没有重复上面的答案,不是吗?
答案 4 :(得分: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"]}]
答案 5 :(得分: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]
答案 6 :(得分:0)
如果使用underscore.js:
2.0*PI/inFramesToProcess
答案 7 :(得分:-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()
]