【问题标题】:How to convert an object to array of objects [duplicate]如何将对象转换为对象数组[重复]
【发布时间】:2018-09-12 16:23:31
【问题描述】:

我有以下对象:

let categories = {
  "Asset Type": ["appliances", "electronics"],
  "Asset Availability": ["in stock"]
}

我需要将其转换为以下结构:

[
   {
     "name": "Asset Type",
     "values": ["Appliances", "Electronics"]
    }, 
    {
      "name": "Asset Availability",
      "values": ["In Stock"]
    }
]

【问题讨论】:

  • 请注意,您不能对结果数组元素的顺序做出任何假设。
  • @SebastianSimon 如果你想得到规范的保证,你可以,但前提是你使用正确的方法(如Reflect.ownKeys)。如果您只是希望结果可靠,您可以使用任何对象迭代方法 - 尽管规范不保证,但幸运的是,环境无论如何都使用相同的算法。 (数组索引,后跟插入顺序字符串,后跟插入顺序符号)

标签: javascript


【解决方案1】:

使用Object.entriesarray.prototype.map 和一些destructuring

var categories = {
  "Asset Type": ["appliances", "electronics"],
  "Asset Availability": ["in stock"]
 };
 
var res = Object.entries(categories).map(([name, values]) => ({name, values}));

console.log(res);

【讨论】:

  • 我找到了这个问题的重复目标,但这个答案比其他任何答案都优雅。
  • 你能解释一下为什么我们必须用()包围返回对象吗?
  • 如果它没有被()包围。 {} 表示粗箭头后的函数体。所以它不会将其视为对象返回。
  • 如果没有 (),javascript 会将 {} 解释为块,而不是对象
【解决方案2】:

const categories =  {
  "Asset Type": ["appliances", "electronics"],
  "Asset Availability": ["in stock"]
 }

const toArray = obj => 
  Object.keys(obj).reduce((acc, key) => [...acc, {name: key, values: obj[key]}], [])

console.log(toArray(categories));

【讨论】:

    【解决方案3】:

    这样试试 ==>

    var obj = {
        "categories":
             {
              "Asset Type": ["appliances", "electronics"],
              "Asset Availability": ["in stock"]
             },
    };
    
    
    var categories = [];
    for(let p in obj.categories) {
    
        categories.push({
            name: p,
            values : obj.categories[p]
        });
    }
    
    console.log(categories);
    

    【讨论】:

      【解决方案4】:

      我最喜欢的方法是:

      1. 在对象的每个键上调用 map 函数。
      2. 创建一个新对象,属性“name”设置为键,值设置为对应的值

      请注意,此方法中的密钥必须是唯一的(无论如何都应该是唯一的):

      var categories = {
        "Asset Type": ["appliances", "electronics"],
        "Asset Availability": ["in stock"]
       };
      
      var res = Object.keys(categories).map(key => ({
            name: key,
            values: categories[key]
          });
      );
      
      console.log(res);
      

      【讨论】:

        【解决方案5】:

        你可以尝试这样的东西或者使用地图功能有很多方法

        let obj = {
            "categories":
                {
                    "Asset Type": ["appliances", "electronics"],
                    "Asset Availability": ["in stock"]
                }
        
        }
        let categories=[];
        Object.keys(obj.categories).forEach(key=>{
            categories.push({"name":key,"value":obj.categories[key]});
        });
        console.log(categories);
        

        【讨论】:

          猜你喜欢
          • 2021-09-29
          • 2023-03-19
          • 2017-09-23
          • 1970-01-01
          • 2018-03-28
          • 1970-01-01
          • 2022-01-23
          • 2017-08-11
          相关资源
          最近更新 更多