У меня есть объект Json, который я анализирую, а затем сравниваю с другим массивом, чтобы найти, где они совпадают. У меня есть код к этому моменту,

var gpaGrades = '{"A": 4, "A-": 3.67, "B+": 3.33, "B": 3, "B-": 2.67, "C+": 2.33, "C": 2, "C-": 1.67, "D+": 1.33, "D": 1, "D-": 0.67, "F":0}';
var letterGrades = ["A", "A-", "B+", "B", "B-", "C+", "C", "C-", "D+", "D", "D-"]

var fallGrades = ["Fall 2015", "A-", "B+", "A", "B", "A"];
var springGrades = ["Spring 2016", "A+", "A+", "A-", "B+", "A"];

var gpa = JSON.parse(gpaGrades);
var sum = 0;
function getGrades(semester){
if(semester === "Fall 2015"){
   for (var i = 1; i < fallGrades.length; i++) { 
        for(var x = 0; x < letterGrades.length; x++){
            if (letterGrades[x].indexOf(fallGrades[i]) >= 0) {
                var getGPA = fallGrades[i];
                console.log(gpa[getGPA]);
            }   
        }
    }
}
}

Это работает и дает мне все значения, которые соответствуют буквенным оценкам и их соответствующие значения баллов. Проблема в том, что мне нужно получить сумму значений gpa [getGPA], чтобы затем вычислить средний балл за тот семестр, который я затем разделю на длину.

Я пытался

var sum += gpa[getGPA]; 

Не уверен, почему это не сработает, так как я видел похожий пример с массивом целых, работающих нормально.

Спасибо за любую помощь.

0
TylerYoc 19 Дек 2015 в 07:21

3 ответа

Лучший ответ

Не используйте var в цикле, это повторно объявляет сумму каждый раз. Используйте var вне циклов (все еще должно работать внутри функции). А затем используйте sum += gpa[getGPA]; внутри циклов.

1
George 19 Дек 2015 в 04:31

Использование var внутри вашего цикла повторно объявляет его как локальную переменную в области действия функции, а не использует глобальное значение sum.

Вам также не нужно использовать внутренний цикл, ваш код будет написан более эффективно, как показано ниже, обратите внимание, что вам нужно fullGrades.length-1, так как первый элемент - это имя семестра .:

var sum = 0;
function getGrades(semester){
    if ( semester === "Fall 2015" ){
        for (var i = 1; i < fallGrades.length; i++) { 
            var grade = fallGrades[i];
            sum += gpa[grade];
            console.log( 'letter', grade, 'numeric', gpa[grade], 'current sum', sum );
        }
    }
}
getGrades("Fall 2015");
console.log( 'total sum', sum, 'average', sum/(fallGrades.length-1) );

Выход

letter A- numeric 3.67 current sum 3.67
letter B+ numeric 3.33 current sum 7
letter A numeric 4 current sum 11
letter B numeric 3 current sum 14
letter A numeric 4 current sum 18
total sum 18 average 3.6
0
doublesharp 19 Дек 2015 в 04:40
    var getGPA =0.0;
    function getGrades(semester){
    if(semester === "Fall 2015"){
       for (var i = 1; i < fallGrades.length; i++) { 
            for(var x = 0; x < letterGrades.length; x++){
                if (letterGrades[x].indexOf(fallGrades[i]) >= 0) {
                  getGPA += fallGrades[i];

                }   
            }
        }
    }
}
console.log(gpa[getGPA]);

Причина, по которой var sum += gpa[getGPA]; не работает, заключается в том, что каждый раз, когда цикл for выполняет итерацию, он инициализирует новую переменную. Я вышел наружу, поэтому он будет инициализирован один раз и сохранит предыдущее значение.

Примечание. Используйте parseFloat для значений с плавающей запятой.

0
Just code 19 Дек 2015 в 04:35