我正在创建一个个人培训 Web 应用程序,其中有一组名为 tasks
的预定义任务。还有另一个名为 sessionTasks
的数组,其中包含 session 的任务。到目前为止的代码:
var tasks = [
["First Task",1,0],
["Second Task...",4,5],
["Third Task!",0,5]
];
var sessionTasks = [
]
注意:任务旁边的数字是该人必须完成任务的分钟和秒数。
function setUpSessionTasks() {
for(sessionFull = false, i = 0; sessionFull == false; i++) {
var sessionTasksSeconds = 0;
alert(sessionFull);
//the seconds that exist in the session
sessionTasksSeconds += (sessionTasks[i][1])*60 + sessionTasks[i][2];
alert(sessionTasks[i][0] + sessionTasksSeconds);
//the seconds of the task that's gonna be added
var randTaskNum = Math.floor(Math.random() * tasks.length);
newTaskSeconds = (tasks[randTaskNum][1])*60 + tasks[randTaskNum][2];
//seconds left in the session to fill
var sessionTasksSecondsToFill = 1200 - sessionTasksSeconds;
if((sessionTasksSeconds + newTaskSeconds) < sessionTasksSecondsToFill) {
sessionTasks.push(tasks[randTaskNum]);
} else {
sessionFull = true;
}
alert(sessionFull);
}
}
我对上面代码的意思是用tasks
中的随机任务填充sessionTasks
,直到sessionTasks
中任务的时间code> 等于或略低于 1200 秒。我可能做了一些根本性错误的事情,但这个函数只是停止了整个页面的工作,并且它没有做我想做的事情。我只是将警报放在那里进行测试,第一个警报有效,但第二个警报无效,我不明白为什么。
如果我要做的这一切都是错误的,那么请帮助我走向正确的方向,但如果不是,请告诉我这段代码中有什么问题。谢谢。
旁注:我想不出更好的问题标题。
最佳答案
看起来您混淆了一些事情:
- 您正在向条目添加秒数
sessionTasksSeconds
在它存在之前:sessionTasksSeconds += (sessionTasks[i][1])*60 + sessionTasks[i][2];
- 在循环的每次迭代中,您都设置
var sessionTasksSeconds = 0;
。所以你永远不可能到达1200
. - 由于某种原因,您从总秒数 (
var sessionTasksSecondsToFill = 1200 - sessionTasksSeconds;
) 中减去了已有的秒数,然后将其与已有的秒数进行了比较。 - 此示例不需要 forloop,
while
循环就可以了。 - 您定义了
sessionFull
作为全局变量(在初始赋值之前缺少var
语句),这可能会带来很多其他问题。
我尝试稍微清理一下代码并减少重复。
另外,我建议使用 console.log
而不是alert
。这样您就可以在控制台中看到一个又一个项目,而不必单击每个警报窗口。
代码:
var tasks = [
["First Task",1,0],
["Second Task...",4,5],
["Third Task!",0,5]
];
function setUpSessionTasks(tasks) {
var sessionTasks = [];
// Before you were always overwriting it in your loop
var sessionTasksSeconds = 0;
//seconds left in the session to fill
var sessionTasksSecondsToFill = 1200;
var sessionFull = false;
while(sessionFull === false) {
//the seconds of the task that's gonna be added
var randTaskNum = Math.floor(Math.random() * tasks.length);
newTaskSeconds = (tasks[randTaskNum][1])*60 + tasks[randTaskNum][2];
if(sessionTasksSeconds + newTaskSeconds <= sessionTasksSecondsToFill) {
sessionTasksSeconds += newTaskSeconds;
sessionTasks.push(tasks[randTaskNum]);
//the seconds that exist in the session
console.log(sessionTasksSeconds);
} else {
console.log('Session full');
sessionFull = true;
}
}
}
setUpSessionTasks(tasks);
https://jsfiddle.net/4rxe9sww/3/
正如上面评论中提到的,使用递归策略,你可能会得到更好的结果并更接近 1200
秒,但这至少使您的示例有效。
关于Javascript:如何将一个数组的组件传输到另一个数组并限制传输的项目数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33067707/