#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
не так важно для вашей проблемы