Как упростить блок кода, который ParseInt извлекает из переменных localstorage - PullRequest
0 голосов
/ 09 мая 2020

У меня есть эта игра, которую я разрабатываю, где я храню значения 1 или 0 как правильные или неправильные ответы в локальном хранилище в переменных q1 - q6.

Поскольку локальное хранилище не хранит числа как целые главная страница загружается, я анализирую все свои переменные, чтобы получить целые числа. Хотя некоторые из них еще ничего не объявлены, поэтому они кажутся NaN или null, поэтому, когда я пытаюсь вычислить сложение всех переменных, он дает мне NaN, если я не использую этот беспорядок кода.

    if (isNaN(totalpoints)) totalpoints = 0;
    if (localStorage.getItem("points") === null){
    localStorage.setItem("points", "0");
    }
    var q0 = parseInt(localStorage.q0);
    var q1 = parseInt(localStorage.q1);
    var q2 = parseInt(localStorage.q2);
    var q3 = parseInt(localStorage.q3);
    var q4 = parseInt(localStorage.q4);
    var q5 = parseInt(localStorage.q5);
    var q6 = parseInt(localStorage.q6);
    if (isNaN(q0))q0=0;
    if (isNaN(q1))q1=0;
    if (isNaN(q2))q2=0;
    if (isNaN(q3))q3=0;
    if (isNaN(q4))q4=0;
    if (isNaN(q5))q5=0;
    if (isNaN(q6))q6=0;
    var totalpoints = totalpoints + q0 + q1 + q2 + q3 + q4 + q5 + q6;
    localStorage.setItem("points", totalpoints);

Я пытаюсь придумать способ, которым я могу упростить этот код, возможно, до нескольких строк, используя al oop для переменных, возможно, или что-то в этом роде? Может ли кто-нибудь дать мне какое-нибудь представление о том, как я могу подойти к этому или, возможно, помочь мне? Я просто не уверен, так как кажется, что мне нужно разобрать переменные localstorage по отдельности? Спасибо

Ответы [ 4 ]

0 голосов
/ 09 мая 2020

Поскольку у вас есть точки q0 - q7 плюс points, есть 8 переменных. Теперь, если мы внимательно go через ваш код, вещи, которые являются общими

  1. Вы получаете переменную из локального хранилища

  2. Вы конвертируете это целое число

  3. Вы проверяете, является ли это NaN. Если NaN, вы устанавливаете 0.

  4. Наконец, вы используете переменную для вычисления суммы

    Хорошо. Итак, мы попытаемся написать функцию, которая выполняет шаги 1-3 с помощью

function oneForAll(variableName){
  if (localStorage.getItem(variableName) === null){
    localStorage.setItem(variableName, "0");
  }
  var variable = parseInt(localStorage.getItem(variableName));
  if (isNaN(variable)) {
      variable = 0;
  }
  return variable
}

Я в основном использовал большинство ваших строк, чтобы вы могли относиться к нему.

Теперь, для шага 4, нам нужно использовать нашу функцию, чтобы получить общую сумму. Также нам понадобится al oop.

var listOfVariables = ["points", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7" ]

var totalPoints = 0;

// loop over the list of variables
listOfVariables.forEach(variableName => {
  totalPoints += oneForAll(variableName);
});

// finally you set the new calculated total points
localStorage.setItem("points", totalpoints);

Надеюсь, это будет полезно.

0 голосов
/ 09 мая 2020

Я бы предложил объект.

Вы можете сохранить объект как answers в localStorage и обновить значения.

Итак, предположим, что объект answers выглядит примерно так

answers = {
   q0: 10,
   q2: 20
}

Тогда не имеет значения, присутствует ли ключ или нет, так как вы можете l oop через объект получить общую сумму

let total = 0;

for (const key in answers) {
    total += answers[key];
}

Конечно, вы должны сохранить этот объект в localStorage вот так

localStorage.setItem('answers', JSON.stringify(answers));

И пока вам нужно его разобрать

const answers = JSON.parse(localStorage.getItem('answers')); 
0 голосов
/ 09 мая 2020

Я предлагаю заменить несколько значений одним массивом. Итак, ваша функция сохранения может быть примерно такой:

function savePoint(point) {
  var points = JSON.parse(localStorage.points || "[]");
  points.push(point);
  localStorage.points = JSON.stringify(points);
}

И вы рассчитаете общую сумму следующим образом:

function calculateTotal() {
  var points = JSON.parse(localStorage.points || "[]");
  return points.reduce(function(total, point) {
    return total + point;
  }, 0);
}

В любом случае, я предлагаю подумать о модели данных для хранения точки и используя JSON.stringify + JSON.parse, чтобы сохранить их в localStorage.

0 голосов
/ 09 мая 2020

Вместо того, чтобы иметь несколько отдельных свойств с числовым индексом c, рассмотрите возможность использования вместо этого одного массива:

const qArr = localStorage.qArr
  ? JSON.parse(localStorage.qArr)
  : new Array(7).fill(0);

Затем вместо присвоения переменным q присвойте индексу qArr, а для его сохранения используйте JSON.stringify:

qArr[3] = 555;
localStorage.qArr = JSON.stringify(qArr);

Чтобы сложить все элементы в массиве, вы можете использовать reduce:

totalPoints = qArr.reduce((a, b) => a + b, totalPoints);

Поскольку похоже, что это все в одном автономном скрипте, я настоятельно рекомендую объединить все соответствующие элементы, которые необходимо сохранить, в один объект, если это вообще возможно, чтобы не загрязнять localStorage с множеством отдельных свойств, которые действительно заслуживают того, чтобы быть в одном месте, а не рассредоточиваться, например:

const dataObj = localStorage.pointsData
  ? JSON.parse(pointsData)
  : {
      totalPoints: 0,
      qArr: new Array(7).fill(0)
    };

Затем выполните что-нибудь с dataObj.totalPoints и dataObj.qArr, и когда вам нужно сохраните это, сделайте что-нибудь вроде:

localStorage.pointsData = JSON.stringify(dataObj);
...