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

标签 javascript arrays multidimensional-array

我正在创建一个个人培训 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/

相关文章:

javascript - 如何使用 jQuery 从 li 标签获取 Id?

javascript - 如何制作字母表特定颜色的javascript颜色字母

javascript - 无法将数据多次放入本地存储

javascript - 刷新后,JS 脚本在部分 View 中不起作用

Python CSV 到 JSON W/数组输出

java - ArrayList 内的 ArrayList - 访问值时出现问题

c - 警告 : assignment makes integer from pointer without a cast, 排序参数

arrays - 使用索引匹配的数组公式

php - 如何从 php 向 Titanium mobile 发送和接收多维数组?

swift - 根据父 UITableVIew 的节索引设置嵌套 UITableView 的行数