我有一个多维数组(json编码,那么它仍然是正确的术语吗?)
{"tasks":[{"task":"first parent task", "sub-tasks":[{"sub-task":"first sub task", "startTime":0, "endTime":30}, {"sub-task":"second sub task", "startTime":65, "endTime":90}]}, {"task":"second parent task", "sub-tasks":[{"sub-task":"task 2 sub task 1", "startTime":35, "endTime":45},{"sub-task":"task 2 sub task 2", "startTime":95, "endTime":100}]}]}
我有一些javascript来获取当前的子任务,我正在尝试通过starttime获取下一个子任务,但由于某种原因,我只能在同一个父任务中获得下一个子任务。 所以我正在寻找的输出是
first parent task - first sub task -> nextTask = second parent task - task 2 sub task 1 -> nextTask = first parent task -> second sub task -> nextTask = second parent task - task 2 sub task 2
这是我目前拥有的代码,但它只从同一个数组中提供子任务。
for(var r=0;r<tasks.length;r++){ for (var i = 0; i<tasks[r].sub-tasks.length){ if(tasks[r].sub-tasks[i].startTime==currenttimer){ showTask(tasks[r].sub-tasks[i], tasks); } } } function showTask(current, tasks){ jQuery('div#currentTask').text(current.sub-task); var nextStep = current+200; // just to set the next beyond the length of all tasks for (var nt=0; nt<tasks.length; nt++){ for (var nst=0; nst<tasks[nt].sub-tasks.length; nt++){ if(tasks[nt].sub-tasks[nst].startTime<nextStep && tasks[nt].sub-tasks[nst].startTime>current.startTime){ jQuery('div#nextTask').text(tasks[nt].sub-tasks[nst].sub-task); } } } }
该代码仅返回第一个父任务子任务,但我不确定原因。有更好的方法吗?
(var r ...语句的初始值在画布上的另一个循环绘图中运行,因此我以这种方式运行循环以防止每秒更新DOM。
我不希望将startTime放入一个单独的数组或类似的东西,因为我需要采用该数组并且无论如何都要引用原始的json,这似乎是浪费。
答案 0 :(得分:1)
您基本上找到了符合您测试资格的第一个节点。您需要找到的是比当前步骤更大的最低值,因此您应该只更新nextStep
,存储nt
和nst
,然后在循环外运行命令。像这样:
function showTask(current, tasks){
jQuery('div#currentTask').text(current.sub-task);
var nextStep = current+200; // just to set the next beyond the length of all tasks
var ntNext, nstNext;
for (var nt=0; nt<tasks.length; nt++){
for (var nst=0; nst<tasks[nt].sub-tasks.length; nt++){
if(tasks[nt].sub-tasks[nst].startTime < nextStep
&& tasks[nt].sub-tasks[nst].startTime > current.startTime){
nextStep = tasks[nt].sub-tasks[nst].startTime;
ntNext = nt;
nstNext = nst;
}
}
}
jQuery('div#nextTask').text(tasks[ntNext].sub-tasks[nstNext].sub-task);
}
请注意,如果两个开始时间相同,它将返回它在该开始时间找到的第一个任务。