2016-10-11 3 views
0

Итак, я сделал базовый калькулятор GPA, и он отлично работает. Мой вопрос, хотя есть, есть ли более простой/чистый способ сделать это, поэтому мне не нужно перечислять значения нижнего и верхнего регистров в моем объекте? Потому что я хочу сделать это так, независимо от того, будет ли это нижняя или верхняя буква, которую вводит пользователь, это все равно означает то же самое. Я попытался выполнить функцию .toUpperCase(), но это не сработало, или я просто сделал это неправильно, и я как бы зациклился на том, как это сделать, или если это возможно, и оставить его таким, как это хорошо. Благодарю. Вот моя цель.Лучший способ сделать буквы нижнего и верхнего регистров имеют одинаковое значение в объекте, отличном от перечисления их всех?

var gradeValues = { 
    "A+": 4.33, 
    "a+": 4.33, 
    "A": 4.0, 
    "a": 4.0, 
    "A-": 3.67, 
    "a-": 3.67, 
    "B+": 3.33, 
    "b+": 3.33, 
    "B": 3.0, 
    "b": 3.0, 
    "B-": 2.67, 
    "b-": 2.67, 
    "C+": 2.33, 
    "c+": 2.33, 
    "C": 2.0, 
    "c": 2.0, 
    "C-": 1.67, 
    "c-": 1.67, 
    "D+": 1.33, 
    "d+": 1.33, 
    "D": 1.0, 
    "d": 1.0, 
    "D-": 0.67, 
    "d-": 0.67, 
    "F": 0, 
    "f": 0 
}; 

Вот остальная часть кода, если вам интересно.

var getGrade = function() { 
    input1 = document.form.input1.value; 
    input2 = document.form.input2.value; 
    input3 = document.form.input3.value; 
    input4 = document.form.input4.value; 

    var inputArray = [input1, input2, input3, input4]; 

    document.getElementById("result").innerHTML = ((gradeValues[input1] + gradeValues[input2] + gradeValues[input3] + gradeValues[input4])/4) + " is your GPA"; 

    for(var i = 0; i < inputArray.length; i++) { 
     if(inputArray[i] === "") { 
      alert("You didn't enter a letter into all of the boxes."); 
      document.getElementById("result").innerHTML = ""; 
      return false; 
     } 
     else if(isNaN(inputArray[i]) === false) { 
      alert("You have to enter a letter, not a number!"); 
      document.getElementById("result").innerHTML = ""; 
      return false; 
     } 
    }; 

ответ

1

Вы можете использовать только строчные буквы (или верхний регистр, но всегда один и тот же случай) в вашем объекте

var gradeValues = { 
    "a+": 4.33, 
    "a": 4.0, 
    "a-": 3.67, 
    "b+": 3.33, 
    "b": 3.0, 
    "b-": 2.67, 
    "c+": 2.33, 
    "c": 2.0, 
    "c-": 1.67, 
    "d+": 1.33, 
    "d": 1.0, 
    "d-": 0.67, 
    "f": 0 
}; 

и преобразовывать входные в нижний регистр для доступа.

gradeValues[input1.toLowerCase()] 

В этом случае я предлагаю использовать оболочку для доступа к объекту, как

function getValue(grade) { 
    return gradeValues(grade.toLowerCase()]; 
} 

Это помогает конвертировать только в одном месте, чтобы сделать преобразование, а не в любом месте, где вы сделайте доступ к gradeValues.

1

Вы не упомянули, как вы пытались использовать toUpperCase(), и почему это не сработало, но это была правильная идея. Нечто подобное должно работать:

input1 = document.form.input1.value.toUpperCase(); 
input2 = document.form.input2.value.toUpperCase(); 
input3 = document.form.input3.value.toUpperCase(); 
input4 = document.form.input4.value.toUpperCase(); 

Он преобразует входные сигналы в верхний регистр, прежде чем искать их в gradeValues объекта, так что вы тогда можете избавиться от всех строчных ключей там.

+0

Это сработало отлично, теперь я чувствую себя глупо. Ценить это. – user6901580

0

Просто введите значения нижнего регистра в gradeValues. Затем используйте .toLowerCase() для входных значений, например:

input1 = document.form.input1.value.toLowerCase();