【问题标题】:Loop through nested json object without knowing the names of a specific layer在不知道特定层名称的情况下循环嵌套 json 对象
【发布时间】:2019-11-02 22:58:59
【问题描述】:

当您不知道这个对象有多少个视图(“A”、“B”、“C”...)时,是否可以循环遍历这个嵌套对象?我目前使用字母索引,但我现在听说“视图层”也可以有不同的名称,所以我不能使用我现在的想法,我必须在不知道“A”,“B”的名称的情况下遍历这个对象, “C”层。有办法吗?

我当前的代码

loopThroughObject()
{
   let alphabet = ["A", "B", "C"];
   let index = 0;

   this.all_tables.views.forEach(views => {

      views[alphabet[index]].forEach(view => {

         view.positionen.forEach(position=> {
           alert( position.field1);
         });

      });

      index++;
});
}

嵌套 JSON 对象

 all_tables = {  
   "views":[  
      {  
         "A":[  
            {  
               "id":"",
               "username":"",
               "status":"",
               "location":"",
               "positionen":[  
                  {  
                     "field1":"",
                     "field2":"",
                     "field3":""
                  },
                  {  
                     "field1":"",
                     "field2":"",
                     "field3":""
                  },
                  {  
                     "field1":"",
                     "field2":"",
                     "field3":""
                  }
               ]
            },
            {  
               "id":"",
               "username":"",
               "status":"",
               "location":"",
               "positionen":[  
                  {  
                     "field1":"",
                     "field2":"",
                     "field3":""
                  },
                  {  
                     "field1":"",
                     "field2":"",
                     "field3":""
                  },
                  {  
                     "field1":"",
                     "field2":"",
                     "field3":""
                  }
               ]
            }
         ],
         "B":[  
            {  
               "id":"",
               "username":"",
               "status":"",
               "location":"",
               "positionen":[  
                  {  
                     "field1":"",
                     "field2":"",
                     "field3":""
                  },
                  {  
                     "field1":"",
                     "field2":"",
                     "field3":""
                  },
                  {  
                     "field1":"",
                     "field2":"",
                     "field3":""
                  }
               ]
            },
            {  
               "id":"",
               "username":"",
               "status":"",
               "location":"",
               "positionen":[  
                  {  
                     "field1":"",
                     "field2":"",
                     "field3":""
                  },
                  {  
                     "field1":"",
                     "field2":"",
                     "field3":""
                  },
                  {  
                     "field1":"",
                     "field2":"",
                     "field3":""
                  }
               ]
            }
         ],
         "C":[  
            {  
               "id":"",
               "username":"",
               "status":"",
               "location":"",
               "positionen":[  
                  {  
                     "field1":"",
                     "field2":"",
                     "field3":""
                  },
                  {  
                     "field1":"",
                     "field2":"",
                     "field3":""
                  },
                  {  
                     "field1":"",
                     "field2":"",
                     "field3":""
                  }
               ]
            },
            {  
               "id":"",
               "username":"",
               "status":"",
               "location":"",
               "positionen":[  
                  {  
                     "field1":"",
                     "field2":"",
                     "field3":""
                  },
                  {  
                     "field1":"",
                     "field2":"",
                     "field3":""
                  },
                  {  
                     "field1":"",
                     "field2":"",
                     "field3":""
                  }
               ]
            }
         ]
      }
   ]
}

【问题讨论】:

  • 这可能吗? :(

标签: json typescript loops object nested


【解决方案1】:

有几个Object 方法可以做到这一点:Object.keys(从 ES5 开始)、Object.values(从 ES2017 开始)、Object.entries(仍处于试验阶段)。对于最通用的方法,您可以使用第一种:

function loopThroughObject() {
  this.all_tables.views.forEach(views => {

    Object.keys(views).forEach(key => {
      let view = views[key];

      view.positionen.forEach(position => {
        alert(position.field1);
      });

    });
  });
}

【讨论】:

  • 太棒了,我用的正是你的例子:)
【解决方案2】:

我认为您的 JSON 结构并不完全正确。

首先,views 属性是 array,但它有 1 个项目,其中唯一的项目是 object 具有查看项目。我认为它首先应该是object,因为 JavaScript 没有任何关联数组类型。

"views": {  
         "A":[ .. ],
         "B":[ .. ],
         ...
}

然后您可以使用Object 方法进行迭代,例如Object.keys()Object.values()Object.entries() 等。

Object.values(this.all_tables.views).forEach(viewGroup => {

     viewGroup.forEach(view => {

         view.positionen.forEach(position=> {
           alert( position.field1);
         });
     });
});

进一步阅读:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object#Methods_of_the_Object_constructor

【讨论】:

  • 谢谢,你说得对,json 结构确实不正确。我以为我需要它们作为“数组”。
【解决方案3】:

您可以使用以下代码

function loopThroughObject()
{
    let index = 0;
    this.all_tables.views.forEach(views => {
       for (var key in views) {
           views[key].forEach(view => {
               view.positionen.forEach(position=> {
                   alert( position.field1);
               });
           });
       }
       index++;
   });
}

【讨论】:

  • 谢谢,这是一种不使用现代技术的方法;)
猜你喜欢
  • 2021-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-28
相关资源
最近更新 更多