Мне нужно преобразовать хэш-карту
{
"fruit" : ["mango","orange"],
"veg" : ["carrot"]
}
to
[
{ "type" : "fruit" , "name" : ["mango","orange"] } ,
{ "type" : "veg" , "name" : ["carrot"] }
]
как это сделать?
Мне нужно преобразовать хэш-карту
{
"fruit" : ["mango","orange"],
"veg" : ["carrot"]
}
to
[
{ "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));
В браузере, поддерживающем 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 для получения одноуровневой копии вашего массива. Поэтому в коде выше, а не:
"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 принимает итераторы, а также объекты типа массива.
Я хотел бы дать "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()
]