从多维数组中获取下一个最低值

时间:2010-12-11 00:44:36

标签: javascript json multidimensional-array

我有一个多维数组(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,这似乎是浪费。

1 个答案:

答案 0 :(得分:1)

您基本上找到了符合您测试资格的第一个节点。您需要找到的是比当前步骤更大的最低值,因此您应该只更新nextStep,存储ntnst,然后在循环外运行命令。像这样:

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

请注意,如果两个开始时间相同,它将返回它在该开始时间找到的第一个任务。