Доступ к случайной переменной из массива для использования в другой переменной

#javascript #html #arrays #random

#javascript #HTML #массивы #Случайный

Вопрос:

У меня есть одна из четырех возможностей для этой конкретной переменной ->

 var lowVelocity = Math.random() * (45 - 30)   30;
var medVelocity = Math.random() * (60 - 45)   45;
var highVelocity = Math.random() * (80 - 60)   45;
var hwyVelcoity = Math.random() * (100 - 80)  80;
  

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

 const velocities = ["lowVelocity", "medVelocity"];
const randomUrban = Math.floor(Math.random() * velocities.length);
  

И это работает — теперь он выбирает одну из двух скоростей, которые меня интересуют. Низкая скорость составляет от 30 до 45, а средняя — от 45 до 60.
В моем innerHTML я хочу напечатать число, возвращаемое из этой переменной, выбранной в массиве. Когда пользователь нажимает на это, запускается функция, в которой есть это.

 document.getElementById("scenario").innerHTML = randomUrban; 
  

Но когда он печатает в HTML, он не печатает число, связанное с переменной, он печатает номер массива, который он выбрал (например, 0 или 1).

Как мне получить переменную (например, если она выбрала lowVelocity, то число, которое она печатает, будет случайным числом, найденным lowVelocity, например 39) для печати вместо номера массива?

Ответ №1:

Вы могли бы просто использовать один массив, чтобы сделать все это за вас!

Если вы добавляете скорости в массив, то случайное число может быть использовано в качестве индекса в этом массиве. В приведенном ниже коде мы используем длину этого массива, чтобы установить ограничения для случайного числа, тогда вы можете просто получить доступ к значению из velocities массива в позиции, указанной случайным числом:

 velocities[randomUrban][1]
  

Это возвращает подмассив в положение, указанное randomUrban , а [1] получает второй элемент в строке, то есть вычисленную скорость.

 /* Add the velocities to an array or easier management */
var velocities= [
    ["lowVelocity", Math.random() * (45 - 30)   30],
    ["medVelocity", Math.random() * (60 - 45)   45],
    ["highVelocity",Math.random() * (80 - 60)   45],
    ["hwyVelcoity" ,Math.random() * (100 - 80)  80]
]

/* Pick a random position from the velocities */
const randomUrban = Math.floor(Math.random() * velocities.length);

/* Print the velocity at that position. (Also includes the velocity name for illustration) */
document.getElementById("scenario").innerHTML = 
              velocities[randomUrban][0]   " = "   velocities[randomUrban][1];  
 <div id="scenario"></div>  

Примечание: В вашем примере вы используете только 2 из 4 скоростей, поэтому вы можете просто добавить скорости, которые вы хотите выбрать, в randomVelocities массив.

Ответ №2:

В вашем случае просто используйте

 document.getElementById("scenario").innerHTML = window[velocities[randomUrban]]; 
  

 var lowVelocity = Math.random() * (45 - 30)   30;
var medVelocity = Math.random() * (60 - 45)   45;
var highVelocity = Math.random() * (80 - 60)   45;
var hwyVelcoity = Math.random() * (100 - 80)   80;
const velocities = ["lowVelocity", "medVelocity"];
const randomUrban = Math.floor(Math.random() * velocities.length);
console.log(randomUrban);// random from velocities
console.log(velocities[randomUrban]); //get variable name
console.log(window[velocities[randomUrban]]); // search in scope where the variables are declared in this case window  

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

1. Спасибо! Это работает так, как ожидалось. Я ценю вашу помощь 🙂 рисовал пробелы! document.getElementById(«сценарий»).innerHTML = window[скорости[randomUrban]]; };

2. Привет @PaulDavis если этот или любой другой ответ решил ваш вопрос, пожалуйста, подумайте о том, чтобы принять его , установив флажок. Это указывает более широкому сообществу, что вы нашли решение, и дает некоторую репутацию как ответчику, так и вам самим. Нет никаких обязательств делать это.

Ответ №3:

Как насчет document.getElementById("scenario").innerHTML = velocities[randomUrban]; ?

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

1. Аааа, выводится вывод «randomUrban» (это хорошо), но не переменная, связанная с randomUrban 🙁

Ответ №4:

Ну, вы пытаетесь напечатать неправильную переменную; randomUrban выбрана ли переменная, содержащая velocities индекс массива.

Быстрым (но довольно грязным) исправлением была бы печать, eval(velocities[randomUrban]) но eval() она устарела из-за проблем с безопасностью.

Немного дольше, но лучшим решением было бы сгруппировать ваши скорости в одну переменную типа object и получить доступ к ее ключам для извлечения числового значения:

 const velObj = {
    lowVelocity: Math.random() * (45 - 30)   30,
    medVelocity: Math.random() * (60 - 45)   45,
    highVelocity: Math.random() * (80 - 60)   45,
    hwyVelocity: Math.random() * (100 - 80)   80
};

const velocities = ["lowVelocity", "medVelocity"];
const randomUrban = Math.floor(Math.random() * velocities.length);
const velKey = velocities[randomUrban];

document.getElementById("scenario").innerHTML = velObj[velKey];  
 <div id="scenario"></div>