Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript:如何将对象的嵌套数组转换为键值对对象_Javascript_Arrays_Json_Parsing_Object - Fatal编程技术网

JavaScript:如何将对象的嵌套数组转换为键值对对象

JavaScript:如何将对象的嵌套数组转换为键值对对象,javascript,arrays,json,parsing,object,Javascript,Arrays,Json,Parsing,Object,这可能是重复的问题,但我已经尝试了很多,但我并没有得到预期的结果。有人能帮我吗。 我在请求体中得到一个数组,如: [ { "name":"array", "book":[ { "name":"name1", "book":"book1" }, { "name":"name2", "book":"book2" } ] }, { "name

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

[
  {
    "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);
已编辑 根据艾哈迈德的回答,我对代码做了一点小改动,它成功了

    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);
const res=[
{
“名称”:“数组”,
“书”:[
{
“名称”:“名称1”,
“书”:“书1”
},
{
“名称”:“名称2”,
“书”:“书2”
}
]
},
{
“名称”:“名称3”,
“书”:“书3”
}
] 
常量obj={}
for(设i=0;i
添加的代码片段应该可以解决您的问题

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

const res=[
{
“名称”:“数组”,
“书”:[
{
“名称”:“名称1”,
“书”:“书1”
},
{
“名称”:“名称2”,
“书”:“书2”
}
]
},
{
“名称”:“名称3”,
“书”:“书3”
}
] 
常量obj={}
for(设i=0;i}
谢谢@Ahmed,但上面的代码没有将主数组转换为键值对(如描述中的上述示例响应)。因此,我在您的代码中做了一些更改,但得到了错误的响应(我在描述中添加了更改后的代码),我删除了(obj中的let item){console.log(item)console.log(obj)的
[项目]}
编码它可以工作..谢谢
    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);