【问题标题】:Traverse JSON object in Javascript?在Javascript中遍历JSON对象?
【发布时间】:2023-03-24 05:09:01
【问题描述】:

下面是我的代码。请帮我循环一下。我想循环完整的 JSON 并进行一些验证,但我无法循环遍历它。我是第一次做,如果能帮到我就好了。

有什么方法可以过滤 JSON 对象。例如,我想搜索 audit1 asgn 值。过滤器可以是动态的,就像它可以是 audit1 或 audit11。我也想知道如何将上面的 json 转换为数组。这将使我的搜索变得容易(以防无法通过直接 JSON 搜索进行搜索)。

function fnMultiRowValidation(){
      var vStatus = 5,
          vJson = '{"tpaCo":[{"name":"Audit Company1",\
                             "aud":[{"name":"auditor1","asgn":"1","fnds":"1","lead":"1"},\
                                    {"name":"auditor2","asgn":"1","fnds":"0","lead":"1"},\
                                    {"name":"auditor3","asgn":"0","fnds":"1","lead":"0"},\
                                    {"name":"auditor4","asgn":"1","fnds":"1","lead":"0"},\
                                    {"name":"auditor5","asgn":"1","fnds":"1","lead":"0"},\
                                    {"name":"auditor6","asgn":"0","fnds":"1","lead":"0"},\
                                    {"name":"auditor7","asgn":"1","fnds":"1","lead":"0"},\
                                    {"name":"auditor8","asgn":"1","fnds":"1","lead":"0"},\
                                    {"name":"auditor9","asgn":"0","fnds":"1","lead":"0"},\
                                    {"name":"auditor10","asgn":"1","fnds":"1","lead":"0"},\
                                    {"name":"auditor11","asgn":"1","fnds":"1","lead":"0"}]},\
                            {"name":"Audit Company2",\
                             "aud":[{"name":"auditor3","asgn":"1","fnds":"1","lead":"1"},\
                                    {"name":"auditor4","asgn":"1","fnds":"1","lead":"0"}\
                                   ]\
                            }\
                          ]}';
          var vObj =  JSON.parse(vJson);


      for (var i=0;i<vObj.tpaCo.length;i++){
        $.each(vObj.tpaCo[i], function(key, value) { 
              console.log(key +':'+ value);
              if(typeof(value)=='object'){
                 //console.log('Auditor length:'+vObj.tpaCo.value.length);
              }
        });  
      }
    }

【问题讨论】:

  • 尽量不要使用$.each,而是先了解for-和for-in-loops。

标签: javascript jquery


【解决方案1】:
vObj.tpaCo.value.length

行不通。您必须使用vObj.tpaCo[key].lengthvalue.length。对于初学者,您不应该将原生 for 循环与 each 迭代混合使用。

使用for- 和for-in-loops:

for (var i=0; i<vObj.tpaCo.length; i++) { // iterate through outer array
    for (var key in vObj.tpaCo[i]) { // enumerate item keys
         console.log(key +':'+ vObj.tpaCo[i][key]); // logs "name" and "aud"
    }
    console.log('Auditor length:'+vObj.tpaCo[i].aud.length);
    for (var j=0; j<vObj.tpaCo[i].aud.length; j++) { // iterate "aud" array
        console.log(vObj.tpaCo[i].aud[j].name);
    }
}

使用变量简化:

var tpacos = vObj.tpaCo;
for (var i=0; i<tpacos.length; i++) {
    var comp = tpacos[i];
    for (var key in comp) {
         var value = comp[key];
         console.log(key +':'+ value);
    }
    var auds = comp.aud;
    console.log('Auditor length:'+auds.length);
    for (var j=0; j<auds.length; j++) {
        var aud = auds[j];
        console.log(aud.name);
    }
}

现在使用Array forEach method

vObj.tpaCo.forEach(function(comp, i) {
    for (var key in comp) {
         var value = comp[key];
         console.log(key +':'+ value);
    }
    console.log('Auditor length:'+comp.aud.length);
    comp.aud.forEach(function(aud, j) {
        console.log(aud.name);
    });
});

还有jQuery's each:

$.each(vObj.tpaCo, function(i, comp) {
    $.each(comp, function(key, value) {
        console.log(key +':'+ value);
    });
    console.log('Auditor length:'+comp.aud.length);
    $.each(comp.aud, function(j, aud) {
        console.log(aud.name);
    });
});

【讨论】:

    【解决方案2】:
      function fnMultiRowValidation(){
      var vStatus = 5,
          vJson = '{"tpaCo":[{"name":"Audit Company1",\
                             "aud":[{"name":"auditor1","asgn":"1","fnds":"1","lead":"1"},\
                                    {"name":"auditor2","asgn":"1","fnds":"0","lead":"1"},\
                                    {"name":"auditor3","asgn":"0","fnds":"1","lead":"0"},\
                                    {"name":"auditor4","asgn":"1","fnds":"1","lead":"0"},\
                                    {"name":"auditor5","asgn":"1","fnds":"1","lead":"0"},\
                                    {"name":"auditor6","asgn":"0","fnds":"1","lead":"0"},\
                                    {"name":"auditor7","asgn":"1","fnds":"1","lead":"0"},\
                                    {"name":"auditor8","asgn":"1","fnds":"1","lead":"0"},\
                                    {"name":"auditor9","asgn":"0","fnds":"1","lead":"0"},\
                                    {"name":"auditor10","asgn":"1","fnds":"1","lead":"0"},\
                                    {"name":"auditor11","asgn":"1","fnds":"1","lead":"0"}]},\
                            {"name":"Audit Company2",\
                             "aud":[{"name":"auditor3","asgn":"1","fnds":"1","lead":"1"},\
                                    {"name":"auditor4","asgn":"1","fnds":"1","lead":"0"}\
                                   ]\
                            }\
                          ]}';
          var vObj =  JSON.parse(vJson);
    
    
        $.each(vObj.tpaCo, function(key, value) { 
              console.log(value.name);
        });  
    }
    

    删除 for 循环。使用这个脚本

    要获取 aud 元素,你需要在当前循环中有一个 $.each 函数

    【讨论】:

      【解决方案3】:

      我很确定您可以摆脱 for 循环,只需使用

      $.each( vObk.tpaCo, function(key, value) {
        console.log(key + ':' + value);
        //... do stuff with value ...
      })
      

      【讨论】:

        【解决方案4】:

        你的代码应该是这样的

        $.each(vObj.tpaCo, function(key, value) { 
                  console.log(key +':'+ value);
                  if(typeof(value)=='object'){
                     //console.log('Auditor length:'+vObj.tpaCo.value.length);
                  }
        });
        

        希望对你有帮助.....

        【讨论】:

        • 不,真的不是。您正在迭代一个布尔值。
        • 有没有办法过滤JSON对象。例如,我想搜索 audit1 asgn 值。过滤器可以是动态的,就像它可以是 audit1 或 audit11。我也想知道如何将上面的 json 转换为数组。这将使我的搜索变得容易(以防无法通过直接 JSON 搜索进行搜索)。
        • 查看此链接搜索Json Search
        • 并将 json 转换为数组,请检查 Link
        【解决方案5】:
        $.each(vObj.tpaCo, function(key, value) { 
                      console.log(value.name+" ")
                      for(i=0; i<value.aud.length; i++)
                      console.log(value.aud[i]);
                }); 
        

        如果你不知道名字

               $.each(vObj, function(key, value){
                $.each(value, function(key, value){
                    for(val in value)
                          if(typeof val == 'string')
                            console.log(value[val]
                          else 
                          for(i=0; i<value[val].length ; i++)
                            console.log(value[val][i]);
        
                });
            });
        

        http://jsfiddle.net/GxER7/

        【讨论】:

        • 如何在JS中获取JSON的属性名。我想让这段代码动态化。可能吗 ?而不是使用 aud 或名称。我希望它是动态的。有可能吗?
        • typeof val 始终是string
        • 其实name字段是string,另一个是object。
        猜你喜欢
        • 1970-01-01
        • 2016-11-18
        • 2017-07-10
        • 2015-09-16
        • 1970-01-01
        • 2015-01-11
        相关资源
        最近更新 更多