【问题标题】:Iterating json array objects using node js使用节点 js 迭代 json 数组对象
【发布时间】:2015-11-02 13:30:47
【问题描述】:

我的任务是遍历包含 json 数组的复杂 json 文件。我无法从 json 文件访问数组对象。

我需要从 json 访问特别是类名对象 文件。

classdetail.json

[ [ {   "student" : [ 
     {
     "name" : "AAaa",
     "class-name" : "A",
     "grade-label" : "AA"   }, 
     {
     "name" : "AAbb",
     "class-name" : "A",
     "grade-label" : "AB"   }, 
     {
     "name" : "AAcc",
     "class-name" : "A",
     "grade-label" : "AB"   }, 
     {
     "name" : "AAdd",
     "class-name" : "B",
     "grade-label" : "AA"   } ],  
      "Average" : 2.5 },

      {   
     "student" : [ 
      {
     "name" : "BBaa",
     "class-name" : "B",
     "grade-label" : "AB"   }, 
      {
     "name" : "BBbb",
     "class-name" : "B",
     "grade-label" : "AA"   }, 
      {
     "name" : "BBcc",
     "class-name" : "B",
     "grade-label" : "AA"   }, 
      {
     "name" : "BBdd",
     "class-name" : "B",
     "grade-label" : "AA"   } ],   
      "Average" : 2.5 } ] ]

迭代.js

var fs = require('fs');
var express = require('express');
var http = require('http');
var publicApis;
var item;
var subItem;


classmem = JSON.parse(fs.readFileSync("classdetail.json", "utf8"));



for (item in classmem) {
  for (subItem in classmem[item]) {
     console.log(classmem[item][subItem]);
  }
}

【问题讨论】:

  • 你遇到了什么错误?
  • 一切正常。 classmem[item][subItem].student 是一个学生数组。
  • 我没有收到任何错误,但我无法访问特定的 json 对象

标签: javascript arrays json node.js


【解决方案1】:
for (item in classmem) {
  for (subItem in classmem[item]) {
     var student = classmem[item][subItem].student;
     for (row in student) {
       console.log(student[row]['class-name']);
     }
  }
}

但请阅读Array.forEach。

【讨论】:

  • 如果我更改数组名称 student-data-details 而不是学生我得到错误为“数据未定义”** el.student-data-details.forEach(function(e, i, a )**
  • 您不能在变量名中使用减号。现在 JS 将其解决为 (el.student) - (data) - (details.forEach....)
【解决方案2】:

for...in 以任意顺序迭代对象属性。它可能不是您想要用于以明确定义的顺序存储项目的数组。 (虽然它应该在这种情况下工作)

试试Array.forEach():

// iterate over `classmem`
classmem.forEach(function(element, index, array) {
  // iterate over classmem[index], which is an array too
  element.forEach(function(el, idx, arr) {
    // classmem[index][idx] contains objects with a `.student` property
    el.student.forEach(function(e, i, a) {
      console.log(e["name"], e["class-name"], e["grade-label"]);
    });
  });
});

【讨论】:

  • 如果我更改数组名称 student-data-details 而不是学生我得到错误为“数据未定义”** el.student-data-details.forEach(function(e, i, a )**
【解决方案3】:

首先检查值是数组,然后访问“类名”值

for (item in classmem) {
    for (subItem in classmem[item]) {
        **if (typeof classmem[item][subItem] === 'object') {
            classmem[item][subItem].forEach(function (val, ind) {
                console.log(val['class-name']);
            });
        }**
    }
}

【讨论】:

  • 我收到此错误“TypeError: Object # has no method 'forEach'”
猜你喜欢
  • 2018-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-22
  • 2011-09-12
相关资源
最近更新 更多