【问题标题】:JavaScript: How to convert nested array of object to key-value pair objectsJavaScript:如何将嵌套的对象数组转换为键值对对象
【发布时间】:2019-12-29 04:36:09
【问题描述】:

这可能是重复的问题,但我已经尝试了很多但我没有得到预期的结果。有人可以帮助我吗? 我在请求正文中得到一个数组,例如:

[
  {
    "name":"array",
    "book":[
      {
        "name":"name1",
        "book":"book1"

      },
      {
        "name":"name2",
         "book":"book2"

      }
    ]
  },
  {
    "name":"name3",
  "book":"book3"
  }

] 

我需要将嵌套数组的数组转换为以下格式

{
  array: [
    {
      name1: "book1"
    },
    {
      name2: "book2"
    }
  ],
  name3: "book3"
}

注意:在某些情况下book 可以是数组或字符串。

在我第一次尝试时,我尝试使用下面的代码将其转换为单个对象,但它不会将嵌套数组转换为键值对

const array=[
      {
        "name":"array",
        "book":[
          {
            "name":"name1",
            "book":"book1"

          },
          {
            "name":"name2",
             "book":"book2"

          }
        ]
      },
      {
        "name":"name3",
      "book":"book3"
      }

    ] 
var result = {};
    for (var i = 0; i < array.length; i++) {
      result[array[i].name] = array[i].value;
    }

    console.log(result);

对上述代码的响应

{
  array: [
    {
      name: "name1",
      book: "book1"
    },
    {
      name: "name2",
      book: "book2"
    }
  ],
  name3: "book3"
}

已编辑 我对艾哈迈德的回答的代码几乎没有什么改动,而且效果很好

    const res=[
          {
            "name":"array",
            "book":[
              {
                "name":"name1",
                "book":"book1"

              },
              {
                "name":"name2",
                 "book":"book2"

              }
            ]
          },
          {
            "name":"name3",
          "book":"book3"
          }

        ] 
    const obj = {}

    for(let  i = 0 ; i < res.length; i++){
      let name = res[i].name
      if(Array.isArray(res[i]['book'])){
        obj[name] = [];
        for(let item in res[i]['book']){
          let key =  res[i]['book'][item]['name']
          let value =  res[i]['book'][item]['book']
          let entry = {}
          entry[key] = value
          obj[name].push(entry)
        }

      }
      else{
         obj[res[i].name]=res[i].book;

      }

    }
console.log(obj);

【问题讨论】:

    标签: javascript arrays json parsing object


    【解决方案1】:

    添加的 sn-p 应该可以解决您的问题。

    您的代码中的问题是适当的嵌套您没有访问想要的值并且没有处理所有情况因此,错误的输出。

    const res = [
                    {
                      "name":"array",
                      "book":[
                        {
                          "name":"name1",
                          "book":"book1"
    
                        },
                        {
                          "name":"name2",
                          "book":"book2"
    
                        }
                      ]
                    },
                    {
                      "name":"name3",
                    "book":"book3"
                    }
                  ] 
    
    const obj = {}
    
    for(let  i = 0 ; i < res.length; i++){
      let name = res[i].name
      if(Array.isArray(res[i]['book'])){
        obj[name] = []
        for(let item in res[i]['book']){
          let key =  res[i]['book'][item]['name']
          let value =  res[i]['book'][item]['book']
          let entry = {}
          entry[key] = value
          obj[name].push(entry)
        }
    
      }
      else{
        obj[name] = res[i]['book']
      }
    
    }
    
    for(let item in obj){
      console.log(item)
      console.log(obj[item])
    }

    【讨论】:

    • 感谢@Ahmed,但上面的代码不会将主数组转换为键值对(如描述中的上述示例响应)。所以,我在你的代码中做了一些改变,我有得到错误的响应(我在描述中添加了更改的代码)
    • 我已经删除了for(let item in obj){ console.log(item) console.log(obj[item]) } 代码它可以工作..谢谢
    猜你喜欢
    • 2019-04-26
    • 1970-01-01
    • 2020-07-07
    • 1970-01-01
    • 1970-01-01
    • 2021-05-28
    • 1970-01-01
    • 2018-01-24
    • 1970-01-01
    相关资源
    最近更新 更多