javascript - 如何将用户的选择设置到我的数组中并随机选择元素

标签 javascript jquery html

我正在尝试让我的程序在不同的持续时间播放音频列表。从音频列表元素4开始,持续时间将取决于用户的选择,并在第一轮中播放4到8范围内的每个元素。 (所以第一轮,程序将播放元素 4, 5,...,8。)

另一个问题是从音频列表中随机选择元素 4 到 8 并播放,但持续时间与用户的选择相同。

我的想法是使用 if 语句 for i = 4,并执行 for 循环。如果我不使用循环,我可以存储用户输入并将其设置为元素的持续时间。但考虑到我需要播放从元素 4 到 8 的音频,所以我认为我应该使用循环,但如果我使用循环,我无法将用户输入存储到我的数组中。为什么是这样?以及如何随机编写代码从元素 4 到 8 中选择数组列表。

感谢您的帮助。我很感激。

<select id="numFollowUp" name="numFollowUp" style=display:none>
            <option value="">Number of follow-up questions</option>
            <option value="4">4</option>
            <option value="5">5</option>
            <option value="6">6</option>
            <option value="7">7</option>
</select>

<select id="secFollowUp" name="secFollowUp" style=display:none>
            <option value="">Second between each question</option>
            <option value="10">10</option>
            <option value="11">11</option>
            <option value="12">12</option>
            <option value="13">13</option>
            <option value="14">14</option>
            <option value="15">15</option>
</select>

var intro_playList = [{
        "duration": 1000,
        "key": "0_silence"
    }, {
        "duration": 500,
        "key": "1_hello"
    }, {
        "duration": 1000,
        "key": "2_how_old"
    }, {
        "duration": 1000,
        "key": "3_what_did_you_make"
    }, {
        // story_playlist
        "duration": 1000,
        //"duration": document.getElementById("secFollowUp").value * 1000,
        "key": "4_tell_me_a_story"
    }, {
        "duration": 1000,
        //"duration": document.getElementById("secFollowUp").value * 1000,
        "key": "5_and_then_what"
    }, {
        "duration": 1000,
        "key": "6_why"
    }, {
        "duration": 1000,
        "key": "7_tell_me_more"
    }, {
        "duration": 1000,
        "key": "8_what_happened_next"
    }];

  $(document).ready(function() {
    var audioElement = document.createElement('audio');

        audioElement.addEventListener("ended", playAudio);

        var i = 0;
        $("#play").on("click", playAudio);

        function playAudio() {
            console.log(i);
            var audioIndex = intro_playList[i++];
            console.log(audioIndex);
            console.log("After " + audioIndex.duration + " seconds play next audio");

            audioElement.src = "sound/" + audioIndex.key + ".wav";
            audioElement.load();
            setTimeout(function() { audioElement.play()}, audioIndex.duration);

            if(i === 4){

                while(i === 4)
                {
                  intro_playList[i].duration = document.getElementById("secFollowUp").value * 1000

                audioElement.src = "sound/" + audioIndex.key + ".wav";
                audioElement.load();
                setTimeout(function(){ audioElement.play()}, audioIndex.duration);
                i++;

                if(i === 8) break;
        }
    }
});

最佳答案

您可以使用 Fisher-Yates shuffle 创建 4-8 的打乱(无重复)序列,如下所示(伪代码):

for (let i = 4; i > 1; i--) {
    let idx = Math.round(Math.random() * (i - 1));
    let t = songs[3 + i];
    songs[3 + i] = songs[3 + idx];
    songs[3 + idx] = t;
}

关于javascript - 如何将用户的选择设置到我的数组中并随机选择元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45558482/

相关文章:

javascript - 使用 JavaScript 使 <a> 标签不可点击的脚本

javascript - 回调绑定(bind)JS对象的解决方案

javascript - 如何在回调中访问正确的 `this`?

JQuery Sortable 以编程方式将项目设置为索引

jquery - ASP.NET MVC 5 不呈现 jQuery UI CSS 包

jquery - 幻灯片按钮 - jquery

javascript - 如何从表单中获取数据?

html - 如何在输入框周围创建 CSS 边框?

javascript - 防止垂直滚动条上的 div 移动出现/消失但不调整窗口大小

javascript - JS事件冒泡防止复选框选中状态