Используйте объект, а не два массива. Я собираюсь предположить, что имена учеников уникальны (хотя в реальной жизни это не так, поэтому мы используем номера учеников), поэтому выделите один объект studentScores
и используйте его в качестве карты:
const studentScores = {};
const N = parseInt(prompt("How many students are there?"));
for (let i=0; i < N; i++) {
let name = prompt("Enter the students names");
if (name) {
studentScores[name] = 0;
}
}
const T = get number of tests
Object.keys(studentScores).forEach(function(name) {
for (let i=0; i<T; i++) {
let score = parseFloat(prompt(`What did ${name} score on test ${i}?`));
if (score) {
studentScores[name] += score;
}
}
});
Если вам абсолютно необходимо использовать параллельные массивы, потому что вы пытаетесь понять, как их использовать, базовая концепция c состоит в том, чтобы никогда не вставлять или извлекать sh из одного массива или извлекать его. Ваши массивы связаны: если вы набираете sh или не переключаетесь, вы делаете это для обоих. Если вы щелкаете или сдвигаетесь, вы делаете это для обоих:
function getScores() {
let input;
const names = [],
scores = [];
// Get the number of students but VERIFY that you got a number:
input = prompt("How many students are there?");
const studentCount = parseInt(input);
// There are many ways to verify this, but using JS coercion through ==
// works quite well. This is one of the few times that == makes sense.
if (studentCount == input) {
for (let i = 0; i < studentCount; i++) {
let name = prompt(`Please give the name for student number ${i}`);
if (name) {
// Here we GUARANTEE that the array positions for
// this name and the associated score are the same:
// if we push to `names`, we also push to `scores`,
// so there is no possibility for the two getting
// "out of sync" with respect to indexing
names.push(name);
scores.push(0);
}
}
}
input = prompt("How many tests did each student take?");
const testCount = parseInt(input);
if (testCount == input) {
names.forEach(function(name, position) {
for (let i = 0; i < testCount; i++) {
input = prompt(`What did ${name} score for test ${i}?`);
let score = parseFloat(input);
if (score == input) {
scores[position] += score;
}
}
});
}
}
Также обратите внимание, что я исправил некоторые вещи в вашем коде: не думайте, что prompt
дает вам что-нибудь: это можно отменить, и ваш код сломается, если вы не будете проверять это. Кроме того, parseInt
или parseFloat
не дают вам число, они могут дать вам число, поэтому проверьте, что они действительно делают, прежде чем переходить к коду, который основан на числах.
Кроме того, строковая композиция: не используйте string + string
, используйте литералы шаблона и шаблон в ваших значениях. Возьмите эту привычку сейчас, она предотвращает множество ошибок, связанных с композицией строк, и головную боль позже, в другом коде.
Затем обратите внимание, что мы используем for (let i=...)
: это сохраняет i
в области видимости для l oop: он не будет существовать до его запуска и не будет существовать после того, как будет выполнен. В отличие от того, когда вы используете for(i=...)
, который совпадает с for(var i=...)
и фактически делает i
переменной области действия, то есть уже существует до запуска кода функции и продолжает существовать после вашего l oop сделано. Что почти никогда не то, что вы хотите.