Javascript 而循环在较高输出期间挂起

Javascript 而循环在较高输出期间挂起,javascript,for-loop,if-statement,while-loop,javascript-objects,Javascript,For Loop,If Statement,While Loop,Javascript Objects,这是我的第一篇帖子 我经营一个爵士乐乐队,有一本超过500首曲子的音乐书。每一场演出我都会制作一个由大约30首不同风格的曲子组成的曲目集。我正在尝试制作一个程序,为我创建一个随机的集合列表,这样我就不必花一个小时自己去做了 代码说明: 每个曲调都是一个对象,有编号、标题和流派。这些对象位于一个名为“master”的数组中 我把每首曲子过滤成三种不同的体裁:摇摆、拉丁和波萨 函数containsObject():如果列表中存在对象,则输出false;如果对象不存在,则输出true。这用于检查正在创

这是我的第一篇帖子

我经营一个爵士乐乐队,有一本超过500首曲子的音乐书。每一场演出我都会制作一个由大约30首不同风格的曲子组成的曲目集。我正在尝试制作一个程序,为我创建一个随机的集合列表,这样我就不必花一个小时自己去做了

代码说明:

  • 每个曲调都是一个对象,有编号、标题和流派。这些对象位于一个名为“master”的数组中
  • 我把每首曲子过滤成三种不同的体裁:摇摆、拉丁和波萨
  • 函数containsObject():如果列表中存在对象,则输出false;如果对象不存在,则输出true。这用于检查正在创建的setlist中是否已经存在一个调谐
  • swing_func()、latin_func()和bossa_func()都是相同的,它们将不同流派数组中的曲调随机拼接到最终的集合列表数组中。这些都在make_setlist()的末尾调用
  • 最终设置列表不能有重复的曲调或重复的流派。首选顺序为swing、latin、bossa、swing、latin、bossa等

    输出: 30首(或另一个数字)随机化的摇摆曲调、拉丁曲调、波萨曲调。没有重复的曲调

    问题: 到目前为止,如果我将setlist长度保持在50以下,则此代码有效

  • 有没有更好的方法来编写swing_func()、latin_func()和bossa_func()?我花了很长时间才弄明白这部分
  • 如果我使setlist长度太长,代码将挂起
  • 设置列表长度代码:

    function make_setlist(){
        while (setlist.length < 30) { //if length is too high, it hangs
            swing_func();
            latin_func();
            bossa_func();
        }
    }
    
    函数make_setlist(){
    而(setlist.length<30){//如果长度太高,它将挂起
    swing_func();
    拉丁函数();
    bossa_func();
    }
    }
    
    完整代码:

    var master = [
        {Number: 0, Title: "Amor", Genre: "latin"},
        {Number: 1, Title: "All", Genre: "bossa"},
        {Number: 2, Title: "Alomony", Genre: "swing"},
        {Number: 3, Title: "Arrow", Genre: "latin"},
        {Number: 4, Title: "Ba", Genre: "latin"},
        {Number: 5, Title: "Bale", Genre: "swing"},
        {Number: 6, Title: "Bonno", Genre: "bossa"},
        {Number: 7, Title: "Bell", Genre: "bossa"},
        {Number: 8, Title: "Call", Genre: "bossa"},
        {Number: 9, Title: "Cow", Genre: "swing"},
        {Number: 10, Title: "Start With This", Genre: "swing"},
        {Number: 11, Title: "Conn", Genre: "latin"},
        {Number: 12, Title: "Ja", Genre: "latin"},
        {Number: 13, Title: "jule", Genre: "bossa"},
        {Number: 14, Title: "ren", Genre: "swing"},
        {Number: 15, Title: "Argh", Genre: "latin"},
        {Number: 16, Title: "wam", Genre: "latin"},
        {Number: 17, Title: "wham", Genre: "swing"},
        {Number: 18, Title: "good", Genre: "bossa"},
        {Number: 19, Title: "create", Genre: "bossa"},
        {Number: 20, Title: "Celllary", Genre: "bossa"},
        {Number: 21, Title: "pig", Genre: "swing"},
        {Number: 22, Title: "Second set start", Genre: "swing"},
        {Number: 23, Title: "lawn", Genre: "latin"},
        {Number: 24, Title: "a", Genre: "latin"},
        {Number: 25, Title: "b", Genre: "bossa"},
        {Number: 26, Title: "c", Genre: "swing"},
        {Number: 27, Title: "d", Genre: "latin"},
        {Number: 28, Title: "e", Genre: "latin"},
        {Number: 29, Title: "f", Genre: "swing"},
        {Number: 30, Title: "g", Genre: "bossa"},
        {Number: 31, Title: "h", Genre: "bossa"},
        {Number: 32, Title: "i", Genre: "bossa"},
        {Number: 33, Title: "j", Genre: "swing"},
        {Number: 34, Title: "k", Genre: "swing"},
        {Number: 35, Title: "l", Genre: "latin"},
        {Number: 36, Title: "m", Genre: "latin"},
        {Number: 37, Title: "n", Genre: "bossa"},
        {Number: 38, Title: "o", Genre: "swing"},
        {Number: 39, Title: "p", Genre: "latin"},
        {Number: 40, Title: "q", Genre: "latin"},
        {Number: 41, Title: "r", Genre: "swing"},
        {Number: 42, Title: "s", Genre: "bossa"},
        {Number: 43, Title: "t", Genre: "bossa"},
        {Number: 44, Title: "u", Genre: "bossa"},
        {Number: 45, Title: "v", Genre: "swing"},
        {Number: 46, Title: "w", Genre: "swing"},
        {Number: 47, Title: "x", Genre: "bossa"},
        {Number: 48, Title: "y", Genre: "swing"},
        {Number: 49, Title: "z", Genre: "latin"},
        {Number: 50, Title: "zacs tune", Genre: "latin"}
    ];
    
    //...................Variables......................................
    var setlist = [];
    var swings = master.filter(tune => tune.Genre === "swing");
    var latins = master.filter(tune => tune.Genre === "latin");
    var bossas = master.filter(tune => tune.Genre === "bossa");
    var r;
    var temparr = [];
    
    //..........................................................................
    //This function works: outputs false if object exists in list and true if object does not exist 
    function containsObject(obj, list) {
      var i;
      for (i = 0; i < list.length; i++) {
            console.log(list[i]);
        if (list[i] === obj) {
                // console.log("object exists within list");
          return false;
        }
      }
        // console.log("object does not exist within list");
      return true;
    }
    
    //...................SWING FUNC.....................................
    function swing_func(){
        r = Math.floor(Math.random() * swings.length);
        while(temparr.length === 0){
            if(containsObject(swings[r], temparr) === true){
                temparr = swings.splice(r, 1);
            } else {
                r = Math.floor(Math.random() * swings.length);
            }
        }
        setlist.push(temparr.splice(0, 1));
    }
    
    //...................LATIN FUNC.....................................
    function latin_func(){
        r = Math.floor(Math.random() * latins.length);
        while(temparr.length === 0){
            if(containsObject(latins[r], temparr) === true){
                temparr = latins.splice(r, 1);
            } else {
                r = Math.floor(Math.random() * latins.length);
            }
        }
        setlist.push(temparr.splice(0, 1));
    }
    
    //...................BOSSA FUNC.....................................
    function bossa_func(){
        r = Math.floor(Math.random() * bossas.length);
        while(temparr.length === 0){
            if(containsObject(bossas[r], temparr) === true){
                temparr = bossas.splice(r, 1);
            } else {
                r = Math.floor(Math.random() * bossas.length);
            }
        }
        setlist.push(temparr.splice(0, 1));
    }
    
    //...................make_setlist FUNC..............................
    function make_setlist(){
        while (setlist.length < 30) { //if length is too high, it hangs
            swing_func();
            latin_func();
            bossa_func();
        }
    }
    
    //...........................call functions.....................................
    make_setlist();
    console.log(setlist);
    
    var主机=[
    {编号:0,标题:“爱”,体裁:“拉丁语”},
    {编号:1,标题:“全部”,体裁:“博萨”},
    {编号:2,标题:“孤独”,体裁:“摇摆”},
    {编号:3,标题:“箭头”,体裁:“拉丁语”},
    {编号:4,标题:“Ba”,体裁:“拉丁语”},
    {编号:5,标题:“贝尔”,类型:“摇摆”},
    {编号:6,标题:“博诺”,体裁:“博萨”},
    {编号:7,标题:“贝尔”,体裁:“博萨”},
    {编号:8,标题:“呼叫”,体裁:“博萨”},
    {编号:9,标题:“奶牛”,体裁:“秋千”},
    {编号:10,标题:“从这个开始”,类型:“swing”},
    {编号:11,标题:“Conn”,体裁:“拉丁语”},
    {编号:12,标题:“Ja”,体裁:“拉丁语”},
    {编号:13,标题:“朱尔”,体裁:“博萨”},
    {编号:14,标题:“任”,体裁:“摇摆”},
    {编号:15,标题:“Argh”,体裁:“拉丁语”},
    {编号:16,标题:“wam”,体裁:“拉丁语”},
    {编号:17,标题:“wham”,类型:“swing”},
    {编号:18,标题:“好”,体裁:“博萨”},
    {编号:19,标题:“创建”,类型:“博萨”},
    {编号:20,标题:“Celllary”,体裁:“bossa”},
    {编号:21,标题:“猪”,类型:“秋千”},
    {编号:22,标题:“第二盘开始”,体裁:“摇摆”},
    {编号:23,标题:“草坪”,体裁:“拉丁语”},
    {编号:24,标题:“a”,体裁:“拉丁语”},
    {编号:25,标题:“b”,体裁:“博萨”},
    {编号:26,标题:“c”,类型:“swing”},
    {编号:27,标题:“d”,体裁:“拉丁语”},
    {编号:28,标题:“e”,体裁:“拉丁语”},
    {编号:29,标题:“f”,体裁:“swing”},
    {编号:30,标题:“g”,体裁:“博萨”},
    {编号:31,标题:“h”,体裁:“博萨”},
    {编号:32,标题:“我”,体裁:“博萨”},
    {编号:33,标题:“j”,类型:“swing”},
    {编号:34,标题:“k”,类型:“swing”},
    {编号:35,标题:“l”,体裁:“拉丁语”},
    {编号:36,标题:“m”,体裁:“拉丁语”},
    {编号:37,标题:“n”,体裁:“博萨”},
    {编号:38,标题:“o”,类型:“swing”},
    {编号:39,标题:“p”,体裁:“拉丁语”},
    {编号:40,标题:“q”,体裁:“拉丁语”},
    {编号:41,标题:“r”,类型:“swing”},
    {编号:42,标题:“s”,体裁:“bossa”},
    {编号:43,标题:“t”,体裁:“博萨”},
    {编号:44,标题:“u”,体裁:“bossa”},
    {编号:45,标题:“v”,类型:“swing”},
    {编号:46,标题:“w”,类型:“swing”},
    {编号:47,标题:“x”,体裁:“博萨”},
    {编号:48,标题:“y”,类型:“swing”},
    {编号:49,标题:“z”,体裁:“拉丁语”},
    {编号:50,标题:“zacs曲调”,体裁:“拉丁语”}
    ];
    //变量。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
    var setlist=[];
    var swings=master.filter(tune=>tune.Genre==“swing”);
    var latins=master.filter(tune=>tune.Genre==“拉丁”);
    var bossas=master.filter(tune=>tune.Genre==“bossa”);
    var-r;
    var temparr=[];
    //..........................................................................
    //此函数起作用:如果列表中存在对象,则输出false;如果对象不存在,则输出true
    函数containsObject(对象,列表){
    var i;
    对于(i=0;i