【问题标题】:How to convert JS Object to Array如何将 JS 对象转换为数组
【发布时间】:2012-05-07 09:14:17
【问题描述】:

我需要转换一个哈希映射

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

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

我该怎么做??

【问题讨论】:

  • 我想知道如何做到这两种方式..
  • 请记住始终提供一些代码标识,它使问题更易于阅读
  • 感谢您的编辑……下次会记住的……
  • 请注意,JavaScript 没有“哈希映射”,只有“对象”。

标签: javascript arrays hash


【解决方案1】:

你可以这样做(在工作的 sn-p 中):

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
  • @Rocket 我不建议在 for...in 循环中检查 hasOwnProperty。
  • @AnuragUniyal:请解释原因。
  • @Rocket:如果没有扩展Object.prototype,为什么会有人这样做?
  • 我在答案中给了 OP 任何一个选项(有或没有hasOwnProperty())。我个人不允许在我的页面中扩展 Object,因此我不必添加额外的代码来保护它。如果我在一个有这种可能性的环境中,我会编写代码来保护它。
【解决方案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.keysArray's 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] })
    }
}

请注意,在这两种情况下,数组的值都是共享的,因为在 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】:

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

      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"]}]
        

        【讨论】:

        • 作为一种好的做法,最好也使用.hasOwnProperty() 方法
        • @F.Calderan 为什么在这种情况下这是必要的,当格式是固定地图时?
        • 我没有说这是必要的,但我们不能说该对象是否通过Object.prototype添加了一些其他属性
        • @F.Calderan:除非您有将可枚举属性添加到Object.prototype 的代码,否则没有必要。如果您还没有这样做,那么使用hasOwnProperty 没有任何意义。
        • @Rocket 如果有人可以在我不知道的情况下修改对象,那么他可以改变例如Array.prototype.join = function(){alert("hacked!")} 现在你会说我应该使用任何数组方法
        【解决方案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()   
            ]
            

            【讨论】:

            • 这……很奇怪。至少重用该功能;)
            猜你喜欢
            • 2022-08-08
            • 1970-01-01
            • 1970-01-01
            • 2020-07-18
            • 2020-07-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多