微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在较高输出时,while循环挂起

如何解决在较高输出时,while循环挂起

这是我的第一篇第一篇文章

我经营一支爵士乐队,其乐曲超过500首。每场演出,我都会创建大约30种不同风格的音乐的清单。我正在尝试制作一个程序,为我创建一个随机的列表,这样我就不必自己花一个小时了。

代码说明:

  1. 每首曲子都是具有数字,标题和流派的对象。这些对象位于名为“ master”的数组中。
  2. 我将每首曲调过滤为三个单独的流派数组:秋千,拉丁舞和波萨斯。
  3. function containsObject():如果列表中存在对象,则输出false;如果不存在对象,则输出true。用于检查创建的设置列表中是否已存在音乐。
  4. swing_func(),latin_func()和bossa_func()都是相同的,并且将各种流派数组中的曲调随机拼接成最终的setlist数组。这些都在make_setlist()的最后调用

最终的清单不能有重复的曲调或重复的类型。首选顺序是秋千,拉丁语,bossa,秋千,拉丁语,bossa等。

输出: 30个(或另一个数字)以秋千,拉丁语,bossa顺序随机播放的音乐。没有重复的声音。

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

  1. 是否有更好的方法来编写swing_func(),latin_func()和bossa_func()?我花了很长时间才弄清楚这部分。
  2. 如果我将清单列表的长度设置得太长,代码会挂起...

SETLIST长度代码

function make_setlist(){
    while (setlist.length < 30) { //if length is too high,it hangs
        swing_func();
        latin_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",{Number: 4,Title: "Ba",{Number: 5,Title: "Bale",{Number: 6,Title: "Bonno",{Number: 7,Title: "Bell",{Number: 8,Title: "Call",{Number: 9,Title: "Cow",{Number: 10,Title: "Start With This",{Number: 11,Title: "Conn",{Number: 12,Title: "Ja",{Number: 13,Title: "jule",{Number: 14,Title: "ren",{Number: 15,Title: "Argh",{Number: 16,Title: "wam",{Number: 17,Title: "wham",{Number: 18,Title: "good",{Number: 19,Title: "create",{Number: 20,Title: "Celllary",{Number: 21,Title: "pig",{Number: 22,Title: "Second set start",{Number: 23,Title: "lawn",{Number: 24,Title: "a",{Number: 25,Title: "b",{Number: 26,Title: "c",{Number: 27,Title: "d",{Number: 28,Title: "e",{Number: 29,Title: "f",{Number: 30,Title: "g",{Number: 31,Title: "h",{Number: 32,Title: "i",{Number: 33,Title: "j",{Number: 34,Title: "k",{Number: 35,Title: "l",{Number: 36,Title: "m",{Number: 37,Title: "n",{Number: 38,Title: "o",{Number: 39,Title: "p",{Number: 40,Title: "q",{Number: 41,Title: "r",{Number: 42,Title: "s",{Number: 43,Title: "t",{Number: 44,Title: "u",{Number: 45,Title: "v",{Number: 46,Title: "w",{Number: 47,Title: "x",{Number: 48,Title: "y",{Number: 49,Title: "z",{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);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。