使用Javascript和下划线循环嵌套对象和数组

Looping through nesting of objects and arrays with Javascript and underscore

本文关键字:对象 数组 嵌套 下划线 Javascript 使用 循环      更新时间:2023-09-26

我正在尝试访问嵌套在数组中的对象。我从这个JSON对象开始(它是从XML数据库输出中派生的):

{"report":
        {"date":"15 Apr 2016",
         "metrics":
            {"metric":
               [
                {"name":"Bank Angle",
                 "display_parent_group":"Bankfull",
                 "display_child_group":"SiteShape",
                 "tolerance":"0.05",
                 "visits":
                  {"visit":
                   [
                    {"visit_id":"3047","value": "0.47"},
                    {"visit_id":"2164","value": "0.55"},
                    {"visit_id":"1568","value": "0.72"},
                    {"visit_id":"3431","value": "0.12"},
                    {"visit_id":"2428","value": "0.44"},
                    {"visit_id":"1567","value": "0.49"}
                   ]}},
                {"name":"Bank Angle SD",
                 "display_parent_group":"Bankfull",
                 "display_child_group":"SiteShape",
                 "tolerance":"0.05",
                 "visits":
                 {"visit":
                  [
                   {"visit_id":"3047","value": "0.12"},
                   {"visit_id":"2164","value": "0.05"},
                   {"visit_id":"1568","value": "0.21"},
                   {"visit_id":"3431","value": "0.68"},
                   {"visit_id":"2428","value": "0.22"},
                   {"visit_id":"1567","value": "0.13"}
                  ]}},
               {"name":"Bankfull Area",
                "display_parent_group":"Bankfull",
                "display_child_group":"SiteSize","tolerance":"0.05",
                "visits":
                 {"visit":
                  [
                   {"visit_id":"3047","value": "202"},
                   {"visit_id":"2164","value": "193"},
                   {"visit_id":"1568","value": "115"},
                   {"visit_id":"3431","value": "258"},
                   {"visit_id":"2428","value": "89"},
                   {"visit_id":"1567","value": "206"}
                  ]}}
               ]
             }
          }
}

然后,我使用下划线提取metric对象的子集:

var table_metric = JSONData.report.metrics.metric;
var target_metrics = _.where(table_metric, {
                  display_parent_group : 'Bankfull', display_child_group: 'SiteShape'
                  });

这将产生一个包含两个嵌套对象的数组。我遇到的问题是访问嵌套在visits.visit中的对象数组。例如,如果我想构建一个与密钥visit_id相关联的值数组,并且我尝试:

function buildVisitIDArray(target_metrics) {
    var attrList = [];
    for(var i=0; i<target_metrics.length; i++) {
      var visit_records = target_metrics[i].visits[1];
      console.log(visit_records);
      for(visit_record in visit_records) {
        attrList.push(_.pluck(visit_record, "visit_id"));
    } 
}
return attrList

}

我只得到一组未定义的结果。我花了几个小时尝试语法的变化,以获得嵌套的"visit"对象,但我似乎无法理解。

任何帮助都非常感谢这位新手!

在buildVisitIDArray函数中,您试图获得target_metrics[i].visits[1],就好像它是一个数组,但它实际上是一个对象,所以您应该这样使用它:

function buildVisitIDArray(target_metrics) {
    attrList = [];
    for(var i=0; i<target_metrics.length; i++) {
        var visit_records = target_metrics[i].visits; // Removed the array call ([1])
        console.log(visit_records);
        for(visit_record in visit_records) {
            attrList.push(_.pluck(visit_records[visit_record], "visit_id"));
        }
    }
    return attrList;
}

希望有帮助:)

如果您没有在代码中的其他地方使用var关键字定义attrList,您也可能会遇到问题。

根据安德烈的回答,你可能想把这句话改为:

visit_records = target_metrics[i].visits.visit;

要深入一层,然后执行常规数组for循环。