получение следующего наименьшего значения из многомерного массива - PullRequest
0 голосов
/ 11 декабря 2010

У меня есть многомерный массив (закодированный в 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 для получения текущей подзадачи, и я пытаюсь получить следующую подзадачу по времени запуска, но по некоторым причинам я получаю только следующую подзадачу в той же родительской задаче. Итак, я ищу вывод, который будет

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

Этот код возвращает только первые родительские задачи, но я не уверен, почему. Есть ли лучший способ сделать это?

Первоначальный оператор for (var r ... выполняется внутри другого цикла рисования на холсте, поэтому я запускаю циклы таким образом, чтобы не обновлять DOM каждую секунду или более.

Я бы предпочел не помещать startTime в отдельный массив или что-то в этом роде, поскольку мне нужно было бы взять этот массив и в любом случае ссылаться на исходный json, и это просто кажется пустой тратой.

1 Ответ

1 голос
/ 16 декабря 2010

Вы в основном находите первый узел, который соответствует вашему тесту.Вам нужно найти самое низкое значение, превышающее текущий шаг, поэтому вам нужно просто обновить 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);
}

Обратите внимание, что, если два времени запуска одинаковы, будет возвращено первое найденное задание с таким временем запуска.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...