Подтвердить что ты не робот

Преобразование хэш-карты в массив

Мне нужно преобразовать хэш-карту

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

to

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

как это сделать?

4b9b3361

Ответ 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));

Ответ 2

В браузере, поддерживающем 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)

Надеюсь, что это поможет.

Ответ 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 принимает итераторы, а также объекты типа массива.

Ответ 4

Я хотел бы дать "oneline" решение:

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

Экономия слов к вашим услугам. Вопрос, заданный для перевода объекта в массив, поэтому я не дублирую выше ответа, не так ли?

Ответ 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"]}]

Ответ 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]

Ответ 7

В случае использования underscore.js:

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

Ответ 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()   
]