JavaScript循环数组

3

我在尝试使用JavaScript并创建了一个多维数组:

var students = [ [['David'], [80]], [['Vinoth'], [77]], [['Goren'],[55]] ];  

然后,我创建了一个if语句,用于测试学生的成绩是否为F到A。

for (var i = 0; i < students.length; i++) {
  for (var j = 1; j < students.length; j++) {
    document.write(students[i][j] + "<br/>");

    if (students[i][j] < 60) {
      document.write(students[i][j] + " is Grade : F");
    } else if (students[i][j] < 70) {
      document.write(students[i][j] + " is Grade : D");
    } else if (students[i][j] < 80) {
      document.write(students[i][j] + " is Grade : C");
    } else if (students[i][j] < 90) {
      document.write(students[i][j] + " is Grade : B");
    } else if (students[i][j] < 100) {
      document.write(students[i][j] + " is  Grade : A");
    }
  }
}

在我追求输出学生姓名和成绩的过程中,我甚至创建了三个for循环,但都没有成功。我在想如何实现以下输出:
David's grade is 80 and is C Grade.
Vinoth's grade is 77 and is C Grade.
Goren's grade is 55 and is F Grade.

你有没有想过为什么代码出现问题?


你为什么在两个for循环中都使用students.length作为限制? - Barmar
你的数据结构没有意义。循环将其视为一个二维分数数组,但该数组还包含名称。为什么名称和分数在另一层数组中? - Barmar
大卫的成绩不应该是B吗?因为他有80分或以上。如果不是,你需要在代码中也将“<”改为“<=”。 - le_m
7个回答

2
其他答案建议您简化数组结构。如果您确实想使用额外的嵌套,您需要进行额外的索引级别。但是您不需要嵌套循环,因为它仍然只是一个线性结构。
for (var i = 0; i < students.length; i++) {
    var student = students[i][0][0];
    var score = students[i][1][0];
    var grade;
    if (score < 60) {
      grade = "F";
    } else if (score < 70) {
      grade = "D";
    } else if (score < 80) {
      grade = "C";
    } else if (score < 90) {
      grade = "B";
    } else if (score < 100) {
      grade = "A";
    }
    document.write(student + "'s score is " + score + ' and is Grade ' + grade + '<br>');
}

此外,如果你希望期望得分为80的成绩产生C而不是B,则在比较时应该使用<=而不是<
一般来说,我建议对于异构数据使用对象而不是数组,因此你的数组应该类似于:
var students = [ {
    name: 'David',
    score: 80
}, {
    name: 'Vinoth',
    score: 77
}, {
    name: 'Goren',
    score: 55
}];

你可以使用 students[i].namestudents[i].score,这样更容易理解。

数组适用于包含相同类型的集合,而对象适用于包含有关一个事物的相关信息的集合。


我同意使用对象而不是制作复杂的多维数组。 - John Wick
1
@le_m 谢谢,我已经添加了一条注释,建议在比较时使用 <= 而不是 <,以便更好地处理成绩处于分数线上的学生。 - Barmar

0

你的学生数组的内部元素,如姓名或成绩,本身被包裹在括号中,因此变成了数组。请移除内部括号。

另外,如果你想根据你的示例,将80分评为'C',则你的比较运算符<应该变为<=

let students = [['David', 80], ['Vinoth', 77], ['Goren', 55]];

// Define rating function:
let rate = (grade) => grade <= 60 ? 'F' : grade <= 70 ? 'D' : grade <= 80 ? 'C' : grade <= 90 ? 'B' : 'A';

// Map students to phrases:
let phrases = students.map((student) => `${student[0]}'s grade is ${student[1]} and is ${rate(student[1])} grade.`);

// Output DOM nodes:
phrases.forEach((phrase) => {
  let el = document.createElement('div');
  el.textContent = phrase;
  document.body.appendChild(el);
});


0

如果你真的,真的只想通过最小的修改来修复你的解决方案而不触及你的数据,那么你需要注意以下三点才能得到你想要的输出:

  • 在结尾处添加document.write("<br>")
  • 内部循环直到students.length - 1
  • 访问学生姓名为students[i][j - 1]

这是完整的修复代码,请点击底部的“运行代码片段”来运行它。

var students = [ [['David'], [80]], [['Vinoth'], [77]], [['Goren'],[55]] ];

for (var i = 0; i < students.length; i++) {
    for (var j = 1; j < students.length - 1; j++) {
        document.write(students[i][j - 1] + "'s grade is ");

        if (students[i][j] < 60) {
            document.write(students[i][j] + " and is Grade : F");
        } else if (students[i][j] < 70) {
            document.write(students[i][j] + " and is Grade : D");
        } else if (students[i][j] < 80) {
            document.write(students[i][j] + " and is Grade : C");
        } else if (students[i][j] < 90) {
            document.write(students[i][j] + " and is Grade : B");
        } else if (students[i][j] < 100) {
            document.write(students[i][j] + " and is  Grade : A");
        }

    }
    document.write("<br>")

}


0

你的数组嵌套了3层。因此,你可能需要运行3个循环。然而,第二层只有2个元素,第三层只有1个元素。所以你只能运行1个循环。请参考以下可工作的代码片段。

var students = [ [['David'], [80]], [['Vinoth'], [77]], [['Goren'],[55]] ];
for (var i = 0; i < students.length; i++) {
    document.write(students[i][0][0] + " ");

    if (students[i][1][0] < 60) {
      document.write(students[i][1][0] + " is Grade : F" + "<br/>");
    } else if (students[i][1][0] < 70) {
      document.write(students[i][1][0] + " is Grade : D"+ "<br/>");
    } else if (students[i][1][0] < 80) {
      document.write(students[i][1][0] + " is Grade : C"+ "<br/>");
    } else if (students[i][1][0] < 90) {
      document.write(students[i][1][0] + " is Grade : B"+ "<br/>");
    } else if (students[i][1][0] < 100) {
      document.write(students[i][1][0] + " is  Grade : A"+ "<br/>");
    }
}


0

你的数据结构很奇怪,因为它是深度嵌套的。

我会将其转换为更浅层次的结构:

var students = [ [ 'David', 80], ['Vinoth', 77], ['Goren', 55] ];

最好定义一个单参数函数来确定成绩等级:
function getGrade(value) {
  if (value > 90) return 'A';
  else if (value > 80) return 'B';
  else if (value > 70) return 'C';
  else if (value > 60) return 'D';
  else return 'F'
}

我更喜欢使用forEach循环,但既然你似乎更喜欢for,那我们可以这样写:

for (let i = 0; i < students.length; i++) {
  console.log(`${students[i][0]}'s grade is ${students[i][1]} and is a ${getGrade(students[i][1])} Grade`);
}

我认为现在推荐使用模板文字还为时过早。IE的任何版本都没有实现它。 - Barmar
@Barmar 那很公平,但这只是示例代码,帖子没有提到它在浏览器中运行。 - Trent Earl

0

在这种情况下,对象数组是更好的数据结构。另外,我已经将分数转换为等级的功能分离到一个函数中,这使得代码更易于阅读和理解。

function getGrade (score) {
  var grades = [
    {
      letter: 'A',
      minScore: 90
    },
    {
      letter: 'B',
      minScore: 80
    },
    {
      letter: 'C',
      minScore: 70
    },
    {
      letter: 'D',
      minScore: 60
    },
    {
      letter: 'F',
      minScore: 0
    }
  ];
  for (var i = 0; i < grades.length; i++) {
    if (grades[i].minScore <= score) return grades[i].letter;
  }
}

var students = [
  {
    name: 'David',
    score: 80
  },
  {
    name: 'Vinoth',
    score: 77
  },
  {
    name: 'Goren',
    score: 55
  }
];

students.forEach(function (student) {
  var str = student.name +
            "'s score is " +
            student.score +
            " and is " +
            getGrade(student.score) +
            " Grade.";
  console.log(str);
});

0

希望这对你有用

var students = [ [['David'], [80]], [['Vinoth'], [77]], [['Goren'],[55]] ];  
    for (var i = 0; i < students.length; i++) {
         document.write("<br/>"+students[i][0] + "'s");

for (var j = 1; j < students.length; j++) { console.log(students[i][0]);

对于(var j = 1; j < students.length; j++){ console.log(students [i] [0]);

if (students[i][j] < 60) {
  document.write(students[i][j] + " is Grade : F");
} 
else if (students[i][j] < 70) {
  document.write(students[i][j] + " is Grade : D");
} else if (students[i][j] < 80) {
  document.write(students[i][j] + " is Grade : C");
} else if (students[i][j] < 90) {
  document.write(students[i][j] + " is Grade : B");
} else if (students[i][j] < 100) {
  document.write(students[i][j] + " is  Grade : A");
}

} }


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接