42

我需要转换哈希图

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

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

我怎么做??

4

8 回答 8

43

您可以这样做(在工作片段中):

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));

于 2012-04-26T15:47:03.777 回答
28

在支持 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)

希望能帮助到你。

于 2012-04-26T16:03:31.943 回答
11

对于那些使用 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采用可迭代对象以及类似数组的对象。

于 2016-12-27T01:07:51.717 回答
6

我想给出一个“单线”解决方案:

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

为您服务的语言经济。要求将对象转换为数组的问题,所以我没有重复上面的答案,不是吗?

于 2016-05-22T22:55:15.600 回答
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"]}]
于 2012-04-26T15:45:55.883 回答
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]
于 2015-05-29T17:49:26.957 回答
0

如果使用 underscore.js:

var original = { 
   "fruit" : ["mango","orange"],
   "veg"   : ["carrot"]
}
var converted = _.map(original, function(name, type){
   return {
      type: type, 
      name: name
   };
});
于 2017-02-01T04:21:20.747 回答
-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()   
]
于 2014-07-25T10:43:15.967 回答