JavaScript: Как хранить, обновлять и вычислять среднее и общее количество значений в наборе пользовательских раз в секундах

#javascript #arrays #sum #average

Вопрос:

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

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

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

Два места, в которых я застрял, — это попытка сохранить время в массиве и суммировать их; плюс получить количество попыток и разделить эту сумму.

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

Вот код, который работает:

     createdTime=Date.now();
        }, time);
        }
        document.getElementById("box").onclick=function() 
    {
        clickedTime=Date.now();
        reactionTime=(clickedTime-createdTime)/1000;
        /*I'm trying to take make an array of reaction 
    times. 
        here is my last attempt:
            recordTime = [];
            sumTime = recordTime.push(reactionTime);
            console.log(recordtime);  
    
 

Он показывает массив времени записи только один раз в консоли как [не определено] и не обновляет массив с новым временем реакции. То, что я ожидал бы/ собираюсь сделать, — это что-то вроде:

  first try/iteration>>box appears>>User Clicks>>reactionTime is measured and calculated>>recordTime: recordTime = [0.530]; 
second try/iteration>>box appears>>User Clicks>>reactionTime is measured and calculated>>recordTime: recordTime = [0.530, 0.511];
third try/iteration>>box appears>>User Clicks>>reactionTime is measured and calculated>>recordTime: recordTime = [0.530, 0.511, 0.353];
fourth try/iteration>>box appears>>User Clicks>>reactionTime is measured and calculated>>recordTime: recordTime = [0.530, 
 0.511, 0.353,...];  
 

с последующим:

   sum(recordTime)/(recordTime.length);
  (put recordTime result into innerHTML for desired element 
  id.)
  (same for recordTime.length).
 

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

Другим вариантом было бы добавить интервал или элемент «всего секунд» на HTML-странице и просто добавить текущее время к общему времени. тем не менее, это все еще ставит меня в почти ту же ситуацию, как заставить JavaScript «запоминать» предыдущие разы, как подсчитать количество попыток и как их усреднить.

Спасибо A_A за ответ на мой вопрос. Все, что мне было нужно, — это массив const=[0]; для хранения значений, сгенерированных пользователем по щелчку мыши. Спасибо, А_А!

Ответ №1:

Если вы хотите добавить элемент в массив, вам не следует инициализировать его снова ( reactionTimes = [] ), так как это сделает его пустым. Поэтому инициализируйте его в начале, а затем вызовите push его.

 const reactionTimes = [];
let startingTime;

function start() {
  startingTime = Date.now();
}

function stop() {
  const reactionTime = Date.now() - startingTime;
  reactionTimes.push(reactionTime);
  console.log(reactionTimes);
} 
 <button id="start" onclick=start()>Start</button>
<button id="stop" onclick=stop()>Stop</button> 

Комментарии:

1. Спасибо! Это была ваша постоянная реакция = []; это позволило мне двигаться вперед! Если бы я прочитал MDN более внимательно, я бы знал, что константа означает «возможность переназначения», а не предполагал, что это означает «неизменный».

2. Пожалуйста. Но если это неясно: основное различие между кодом вашего вопроса и моим ответом заключается в том, что я переместил объявление за пределы onclick обработчика. Поэтому в моем случае все вызовы функции onclick используют один и тот же массив времени реакции. В вашем случае он был объявлен внутри функции onclick, поэтому каждый вызов onclick объявлял и использовал свой собственный массив времени реакции. В этом главное отличие. Так это const let или var не так важно для вашей проблемы