Javascript:如何将一个数组的组件传输到另一个数组,并限制传输的项目数

Javascript:如何将一个数组的组件传输到另一个数组,并限制传输的项目数,javascript,arrays,multidimensional-array,Javascript,Arrays,Multidimensional Array,我正在创建一个个人培训web应用程序,其中有一系列预定义的任务,称为任务。还有另一个名为sessionTasks的数组,它将包含会话的任务。迄今为止的代码: var tasks = [ ["First Task",1,0], ["Second Task...",4,5], ["Third Task!",0,5] ]; var sessionTasks = [ ] 注意:任务旁边的数字是完成任务所需的分钟和秒数 function setUpSessionTasks() { for(ses

我正在创建一个个人培训web应用程序,其中有一系列预定义的任务,称为
任务
。还有另一个名为
sessionTasks
的数组,它将包含会话的任务。迄今为止的代码:

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);

}

}
函数setUpSessionTasks(){
for(sessionFull=false,i=0;sessionFull==false;i++){
var sessionTasksSeconds=0;
警报(会话已满);
//会话中存在的秒数
sessionTasksSeconds+=(sessionTasks[i][1])*60+sessionTasks[i][2];
警报(sessionTasks[i][0]+sessionTasksSeconds);
//要添加的任务的秒数
var randTaskNum=Math.floor(Math.random()*tasks.length);
newTaskSeconds=(tasks[randTaskNum][1])*60多个tasks[randTaskNum][2];
//会话中还有几秒钟要填充
var sessionTasksSecondsToFill=1200-sessionTasksSeconds;
如果((sessionTasksSeconds+newtasksseconds)
我想用上面的代码来填充
sessiontask
中的随机任务,直到
sessiontask
中的任务时间等于或略低于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任务=[
[“第一项任务”,1,0],
[“第二项任务…”,4,5],
[“第三个任务!”,0,5]
];
函数setUpSessionTasks(任务){
var sessionTasks=[];
//之前,您总是在循环中覆盖它
var sessionTasksSeconds=0;
//会话中还有几秒钟要填充
var sessionTasksSecondsToFill=1200;
var sessionFull=false;
while(sessionFull==false){
//要添加的任务的秒数
var randTaskNum=Math.floor(Math.random()*tasks.length);
newTaskSeconds=(tasks[randTaskNum][1])*60多个tasks[randTaskNum][2];

如果(sessiontaskseconds+newTaskSeconds)为什么要添加尚未定义的sessiontaskseconds的秒数:
sessiontaskseconds+=(sessionTasks[i][1])*60+sessionTasks[i][2];
?您应该使用递归函数在第二个数组中推送第一个数组的随机项,直到达到总时间限制(递归函数应该会中断)这非常有效:-)我唯一做的更改是将变量声明放在
setUpSessionTasks()
函数中,它仍然有效。您的答案非常清楚,如果可以的话,我会投更多票:-)
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);