同时检查多个数组中的布尔值,而无需多个if语句

时间:2018-12-10 18:14:10

标签: javascript jquery arrays boolean

代码正在运行,但是我敢肯定有一种更有效的方法来执行此操作。目前,它在Firefox中可以正常工作,但在Chrome中却无法解决。在相距110ms的每个步骤中检查布尔值,并且数组中的项目是true还是false的结果确定声音是否被触发(对于该数组是唯一的)。当Chrome出现峰值时,代码中的某些信息会堆积起来,这会导致各种故障和泄漏……我似乎无法找出一种方法将这些全部捆绑到每个循环中进行一次检查,而不是运行所有这些{{ 1}}语句。有可能吗?

if

如果var loop = [{ "sound": "one", "pattern": [true, false, false, false], "volume": 100 },{ "sound": "two", "pattern": [false, true, false, true], "volume": 100 },{ "sound": "three", "pattern": [true, true, true, true], "volume": 100 }] var s = 0; function startLoop(){ if (playing === true){ setTimeout(function(){ if (typeof loop[0] !== "undefined") { if (loop[0].pattern[s] === true){ soundset.play(loop[0].sound); } } if (typeof loop[1] !== "undefined") { if (loop[1].pattern[s] === true){ soundset.play(loop[1].sound); } } if (typeof loop[2] !== "undefined") { if (loop[2].pattern[s] === true){ soundset.play(loop[2].sound); } } s++; if (s < loop[0].pattern.length){ startLoop(); } else { s = 0; startLoop(); } }, 110) } else {return;} }; 上方的循环不存在,则typeof loop[x] !== "undefined"就位。该计划原本大约要运行10个,但是这种检查每个步骤的方法却只有三个。

2 个答案:

答案 0 :(得分:1)

尝试一下:

var loop = [
    {
        "sound": "one",
        "pattern": [true, false, false, false],
        "volume": 100
    },{
        "sound": "two",
        "pattern": [false, true, false, true],
        "volume": 100 
    },{
        "sound": "three",
        "pattern": [true, true, true, true],
        "volume": 100 
    }
];

var s = 0;
function startLoop(){   
    if (playing !== true)
        return;
    setTimeout(function(){ 
        for(const i in loop){
            if(loop[i].pattern.hasOwnProperty(s)){
                if(loop[i].pattern[s]){
                    soundset.play(loop[i].sound);
                }
            }else{
                s = 0;
            }
        }
        s++;
        startLoop();
    }, 110);
};

答案 1 :(得分:1)

  • 使用forEach() ,而不是对loop[0], loop[1], etc…进行硬编码。这样一来,您就可以拥有无​​穷无尽的乐器。
  • 停止(或暂停)播放时,
  • 清除时钟超时
  • 预加载声音(并将它们填充到每个loop对象.audio中)。
  • 您可以使用truefalse代替01来简洁地指示 boolean 值。
  • 音量0.01.0
  • 您可以使用 Modulo oparator (模数屏蔽器) %环回0您的股票代码索引。

s