Заставить компилятор читать строку как переменную

Я пытаюсь воспроизвести случайный аудиоклип в игре, которую делаю в Phaser 3. Я хочу воспроизвести любое из следующих событий, когда произойдет определенное событие:

audioBanshee0 = this.sound.add('audioBanshee0',{volume: 0.5});     
audioBanshee1 = this.sound.add('audioBanshee1',{volume: 0.5});     
audioBanshee2 = this.sound.add('audioBanshee2',{volume: 0.5});     
audioBanshee3 = this.sound.add('audioBanshee3',{volume: 0.5});    
audioBanshee4 = this.sound.add('audioBanshee4',{volume: 0.5}); 

Я пробовал следующее:

var ref = Math.floor(Math.random() * Math.floor(5));
const audioBansheeScreech = "audioBanshee" + ref;
audioBansheeScreech.play();

я получаю сообщение об ошибке

audioBansheeScreech.play() is not a function

потому что audioBansheeScreech это строка. Я могу обойти это с помощью циклов for и операторов if, но я бы предпочел избегать.

попробуй this.sound.add("audioBanshee" + ref, { volume: 0.5 }).play()

Alex Shtromberg 30.05.2019 14:20

Не знаю о фазере, но вам, вероятно, следует создать массив audioBanshee. Тогда получите рандом с помощью array[ref]

adiga 30.05.2019 14:20

спасибо, Алекс, попробовал, я получаю другую ошибку.. похоже, мне придется идти в этом направлении, адига... просто подумал, что может быть трюк в java-скрипте. Спасибо

Steve Qsack 30.05.2019 14:25
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
3
39
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Их может быть проще переместить в объект, тогда вы можете вызывать их с помощью строки:

const audioBanshees = {
  audioBanshee0: this.sound.add('audioBanshee0',{volume: 0.5}),
  audioBanshee1: this.sound.add('audioBanshee1',{volume: 0.5}),
  audioBanshee2: this.sound.add('audioBanshee2',{volume: 0.5}),
  audioBanshee3: this.sound.add('audioBanshee3',{volume: 0.5}),
  audioBanshee4: this.sound.add('audioBanshee4',{volume: 0.5})
}

let ref = Math.floor(Math.random() * Math.floor(5));

const audioBansheeScreech = audioBanshees["audioBanshee" + ref];

audioBansheeScreech.play()

Хотя IMO, массив здесь был бы более логичным и легким для чтения:

const audioBanshees = [
  this.sound.add('audioBanshee0',{volume: 0.5}),
  this.sound.add('audioBanshee1',{volume: 0.5}),
  this.sound.add('audioBanshee2',{volume: 0.5}),
  this.sound.add('audioBanshee3',{volume: 0.5}),
  this.sound.add('audioBanshee4',{volume: 0.5})
]

let ref = Math.floor(Math.random() * Math.floor(5));

const audioBansheeScreech = audioBanshees[ref];

audioBansheeScreech.play()

почему вы говорите логичнее?

Steve Qsack 30.05.2019 15:51

Только потому, что здесь мы хотим хранить и получать доступ к плоскому списку значений, используя случайный индекс в качестве идентификатора. Для этой задачи больше подходит массив, а не объект (ИМО), но оба метода будут работать.

Oli 30.05.2019 16:37

Другие вопросы по теме