c_k*_*ick 8 javascript arrays jquery
我正在构建一个循环文本生成器.生成器将来自多个数组的句子(文本)组合在一起,通过视觉"循环"并附加它们.我认为最好用我现在构建它的基本版本的生成器创建一个小提琴:
说明
基本工作如下:
Array1,Array2并且Array3在小提琴)combo0并且combo1在小提琴中)Generate调用该函数,该函数可视化地循环句子中的句子(combo0[0]在小提琴中)var times = 8在小提琴中)Generate再次运行,这次使用第二个数组(combo0[1]在小提琴中)回调的原因是我需要"等待"循环效果完成,然后再继续.
问题
虽然这正是我所需要的(而且我非常怀疑这是否是这样做的方法;我在写一个循环自身的函数时总觉得有点奇怪),我有以下问题:
在combo数组中,我定义哪个'句子'数组可以是可能的组合.如果有两种组合,这可以正常工作,但有两个以上,我有一个问题:
Generate(combo0[0], i, function(i) { //generate from first array element of combo0, callback to generating from second array of combo0
Generate(combo0[1], i, function(i) {
$('div#status').html('Done!'); //show status
$('input#generate').removeAttr("disabled"); //enable button
});
})
Run Code Online (Sandbox Code Playgroud)
我必须递归地重写它以适应combo由3个甚至4个选项组成的数组的可能性.如果一个combo数组只包含2个(或1个)数组,这可能会破坏脚本.
这就是我被困住的地方.主要问题是,如果我循环遍历combo数组,例如使用.each();,generate则会同步多次调用该函数,因此整个"循环"效果将丢失.
我已经尝试编写各种循环,考虑到给定combo数组的数组长度,但我今天比以往更多的浏览器崩溃,我无法弄清楚该怎么做.
我已经设法修复它。离开屏幕一段时间是件好事。
我所做的是添加一个“n”计数器,如果达到变量的倍数times,该计数器就会增加,导致函数继续迭代,但从下一个数组(参见倒数第三行)输出lists[n]。最后,检查剩余的数组数量将确定我们是否完成。如果完成,最后一次写下该句子,运行可选的回调并返回 false。这样,该函数将接受整个数组,而不仅仅是子数组(combo与 相反combo[0]):
//Generate from array 'lists', simulating a 'slot machine
function Generate(lists, n, i, callbackFnk) {
if (!(i >= 0)) { i= 0; }
setTimeout((function(msg){
i++;
return function(){
if (i % times != 0){
//We haven't reached a multiple of the times variable yet, keep going.
Generate(lists, n, i, callbackFnk);
} else if (i % times === 0 && i != 0 && n < (lists.length-1)) {
//Multiple reached, increase n
n++;
Generate(lists, n, i, callbackFnk);
} else if (n == (lists.length-1)) {
//we are done as there are no more arrays to go over
showMessage(msg, i);
if (callbackFnk) callbackFnk.call(this, i);
return false;
}
showMessage(msg, i);
}
})(
//output using the given n value
lists[n][Math.floor(Math.random() * lists[n].length)]
), speed);
}
Run Code Online (Sandbox Code Playgroud)
请参阅此处的工作小提琴:http ://jsfiddle.net/c_kick/kuNrA/1/
我希望这对其他人有帮助!