我需要转换一个哈希映射。
{
"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));
for...in
循环内部检查 hasOwnProperty
。 - gen_EricObject.prototype
,为什么会这样做呢? - user1106925hasOwnProperty()
)。我个人不允许在我的页面中扩展Object
,因此我不必添加额外的代码来防止它。如果我处于可能出现这种情况的环境中,我会编写代码以防止它发生。 - jfriend00Object.keys()
和 .map()
,并将所有示例转换为可工作的代码片段。 - jfriend00var stuff = {
"fruit" : ["mango","orange"],
"veg" : ["carrot"]
}
var array = Object.keys(stuff).map(function(key) {
return {"type" : key, "name" : stuff[key] }
})
请参见:Object.keys,Array的map。
或者,以老式的方式:
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] })
}
}
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 maps的人...
假设您已经...
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 不仅接受数组对象,还接受可迭代对象。
var b = Object.keys(a).map(e => { return { type:e, name:a[e] } });
为您提供经济的文字服务。问题要求将对象转换为数组,因此我不会重复上面的答案,对吧?
虽然这不完全是你所寻找的答案,但对于一般目的可能会有用。
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]
看起来很简单,你的地图的键是类型,值是名称,所以只需遍历地图并将对象插入列表中,例如:
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"]}]
Object.prototype
,那么你应该停止使用它。而 Rocket 的例子是一种破坏行为。 - user1106925Array.prototype.join = function(){alert("hacked!')}
,那么现在你会说我应该使用任何数组方法吗? - Anurag Uniyal如果使用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()
]