По сути, у меня есть два массива связанных элементов массива, где один элемент выбирается случайным образом.
Я хочу напечатать связанный элемент второго массива. Допустим, у вас есть массив имен заданий, и он выглядит так:
const jobNames = ["Builder", "Doctor", "Vet"];
Затем выбирается случайное имя работы, подобное этому:
var randomJobName = jobNames[ Math.floor(Math.random() * jobNames.length) ];
Теперь у вас есть еще один массив, в котором для каждого элемента содержится описание связанного с ним имени задания.
Как можно получить доступ к связанному элементу из второго массива, если у него есть случайно выбранный элемент из первого массива?
Это выбирает один случайный индекс. Это не случайно на массив, если вы делаете arr1[index]
и arr2[index]
. Конечно, лучшее решение состоит в том, чтобы нет имел два совпадающих массива, если вы хотите, чтобы данные были вместе.
Итак, как бы выглядел полный код, если бы я хотел напечатать и задание, и описание задания в разных строках?
Если имена вакансий и описания вакансий связаны вместе, мне интересно, почему они вообще находятся в двух разных массивах. Это идеальный вариант использования объектов. я бы структурировал так
const jobs = [
{name: "Builder", description: "Builds Stuff"},
{name: "Doctor", description: "Heals Stuff"},
{name: "Vet", description: "Heals Stuff but for animals."}
]
Использование деструктуризация объекта для доступа к значениям:
const {name, description} = jobs[Math.floor(Math.random() * jobNames.length)]
alert(`Found job: ${name} who ${description}`)
Есть в основном 3 разных подхода.
Самый простой — это, как уже предложил ВЛАЗ, один раз получить случайный индекс и обращаться к обоим элементам каждый из своего массива по этому случайному индексу.
const jobNames = ['Builder', 'Doctor', 'Vet'];
const jobDescriptions = [
'creates/builds things/stuff.',
'tries fixing human health issues.',
'does fix animal health issues.',
];
const randomIdx = Math.floor(Math.random() * jobNames.length);
const jobName = jobNames[randomIdx];
const jobDescription = jobDescriptions[randomIdx];
console.info({ jobName, jobDescription });
.as-console-wrapper { min-height: 100%!important; top: 0; }
В случае, если OP не имеет возможности использовать один случайный индекс за раз и, таким образом, вынужден работать с уже случайно выбранным именем задания, тогда OP необходимо найти индекс этого самого имени задания, откуда OP затем может приступить к выбору соответствующего описания работы ...
const jobNames = ['Builder', 'Doctor', 'Vet'];
const jobDescriptions = [
'creates/builds things/stuff.',
'tries fixing human health issues.',
'does fix animal health issues.',
];
// OP has no control about how `jobName` is/was/gets chosen.
const jobName = jobNames[ Math.floor(Math.random() * jobNames.length) ];
const index = jobNames.indexOf(jobName);
const jobDescription = jobDescriptions[index];
console.info({ jobName, jobDescription });
.as-console-wrapper { min-height: 100%!important; top: 0; }
В случае, если такая задача должна выполняться часто/повторно и в случае, если OP может изменить код, поскольку OP доволен, подход состоял в том, чтобы объединить оба массива в массив агрегированных элементов задания (имя и описание) и сделать случайный выбор один раз из этой новой структуры массива...
const jobNames = ['Builder', 'Doctor', 'Vet'];
const jobDescriptions = [
'creates/builds things/stuff.',
'tries fixing human health issues.',
'does fix animal health issues.',
];
const jobList = jobNames
.map(function (name, idx) {
const description = this[idx];
return {
name,
description,
};
// `jobDescriptions` applied as
}, jobDescriptions); // `map`'s 2nd `thisArg` argument.
function getRandomArrayIndex(arr) {
return Math.floor(Math.random() * arr.length);
}
const {
name,
description,
} = jobList[ getRandomArrayIndex(jobList) ];
console.info({ name, description });
console.info({ jobList });
.as-console-wrapper { min-height: 100%!important; top: 0; }
var index = Math.floor(Math.random()*JOB_ARRAY.length)
, а затем используйте его для обоих массивов.