编写递归if语句的更好方法

时间:2010-12-18 01:45:38

标签: javascript

我偶尔会发现自己处于这个位置,而且我确信有比现在更好的方法。

在这个例子中,我试图对一组有冲突的项目进行排序。我需要知道什么时候是高优先级,不能移动,vs低优先级,可以移动。 但我很确定这段代码非常低效。

var holdLowPriorities = [];

for (conflict = 0; conflict < sortedTimes.length - 1; conflict++) {
    var firstConflictTimeStart = sortedTimes[conflict][0];
    var firstConflictTimeEnd = sortedTimes[conflict][1];
    var secondConflictTimeStart = sortedTimes[conflict + 1][0];
    var secondConflictTimeEnd = sortedTimes[conflict + 1][1];

    if (firstConflictTimeStart < secondConflictTimeEnd && 
            firstConflictTimeEnd > secondConflictTimeStart) {
        // are either of the conflicts a high priority
        var firstContactPriority = sortedTimes[conflict][2];
        var secondContactPriority = ortedTimes[conflict + 1][2]

        if (firstConflictPriority == 2) {
            //this is high priority, can't move
        }
        if (secondConflictPriority == 2) {
            // this is also a priority, but has to move
        }
        // are either of the conflicts a low priority?
        if (firstConflictPriority == 0) {
            // this is a low priority so I can adjust the time
        } else if (secondConflictPriority == 0) {
            // this is a low priority so I can adjust the time
        }
    }
}

不幸的是,我甚至不知道该怎么称呼这类问题,因此不知道该找什么,但我确信答案并不过分复杂(我希望不管怎么说)。

3 个答案:

答案 0 :(得分:2)

switch语句可能有助于清理代码。

答案 1 :(得分:2)

编辑:您已经改变了问题,因此大部分问题变得无关紧要。

以下是对此的简单说明。

var holdLowPriorities = [];

for(conflict=0; conflict<sortedTimes.length-1; conflict++){
  var conflictTime = sortedTimes[conflict],
      nextConflictTime = sortedTimes[conflict + 1];
  if (conflictTime[0] >= nextConflictTime[1] || conflictTime[1] <= nextConflictTime[0]) {
    continue;
  }

  // are either of the conflicts a high priority 
  if (data[conflictTime[2]].stepsArr[conflictTime[3]].priority==2) {
    alert(data[conflictTime[2]].stepsArr[conflictTime[3]].
  }
  if (data[nextConflictTime[2]].stepsArr[nextConflictTime[3]].priority == 2) {
    alert(data[nextConflictTime[2]].stepsArr[nextConflictTime[3]].
  }  

  // are either of the conflicts a low priority?
  if (data[conflictTime[2]].stepsArr[conflictTime[3]].priority==0) {
    holdLowPriorities.push([conflictTime[2], conflictTime[3], conflict]);
  } else if (data[nextConflictTime[2]].stepsArr[nextConflictTime[3]].priority == 0) {
    holdLowPriorities.push([nextConflictTime[2], nextConflictTime[3], conflict+1])
  }

  //alert(data[nextConflictTime[2]].stepsArr[nextConflictTime[3]].prerequisite+' '+conflictTime[0]+' '+conflictTime[1]+' '+nextConflictTime[0]+' '+nextConflictTime[1]+' '+data[nextConflictTime[2]].stepsArr[nextConflictTime[3]].taskid+' / '+data[conflictTime[2]].stepsArr[conflictTime[3]].taskid);
}

然后通过使用辅助方法和更多变量可以使这更加明显。

function conflictData(conflict) {
    return data[conflict[2]].stepsArr[conflict[3];
}

var holdLowPriorities = [];

for(conflict=0; conflict<sortedTimes.length-1; conflict++){
  var conflictTime = sortedTimes[conflict],
      nextConflictTime = sortedTimes[conflict + 1];
  if (conflictTime[0] >= nextConflictTime[1] || conflictTime[1] <= nextConflictTime[0]) {
    continue;
  }

  var thisConflictData = conflictData(conflictTime),
      nextConflictData = conflictData(nextConflictTime);

  // are either of the conflicts a high priority
  if (thisConflictData.priority == 2) {
    alert(thisConflictData);
  }
  if (nextConflictData.priority == 2) {
    alert(nextConflictData);
  }

  // are either of the conflicts a low priority?
  if (thisConflictData.priority == 0) {
    holdLowPriorities.push([conflictTime[2], conflictTime[3], conflict]);
  } else if (nextConflictData.priority == 0) {
    holdLowPriorities.push([nextConflictTime[2], nextConflictTime[3], conflict+1])
  }

  //alert(nextConflictData.prerequisite + ' ' + conflictTime[0] + ' ' + conflictTime[1] + ' ' + nextConflictTime[0] + ' ' + nextConflictTime[1] + ' ' + nextConflictData.taskid + ' / ' + thisConflictData.taskid);
}

如果这样表达,我认为你可以开始看到可能的错误;高优先级有conflictTime和nextConflictTime检查,如果,如果,低优先级有if,否则if。这是期望的吗?然后,您可以将此/下一个冲突优先级置于交换机中,或者更多地重新组织代码。但我认为现在处于可以更容易理解的阶段。

答案 2 :(得分:1)

就数据结构而言,if..else块没有任何固有的低效率。即使嵌套if..else也不是问题。就可读性而言,这完全是另一回事。根据经验,大而深度嵌套的if..else块很难遵循(对于人类来说,计算机当然没有问题)。

首先,我会使用Mitch的建议来使用中间变量来减少代码冗长。在效率方面,它肯定会降低内存效率(尽管对于javascript,它可能会根据浏览器加速访问)。但效率不是重点,代码清晰度是。

其次,使用数组文字语法而不是new Array()holdLowPriorities.push([...])。同样,屏幕上的噪音越少,就越容易看到发生了什么。

第三,有几个地方你所做的只是检查某事的优先级。使用辅助函数或方法来简化代码:checkProirity(sortedTimes,conflict,2)sortedTimes.checkProirity(conflict,2)。同样,函数/方法调用本质上效率较低,但重点是提高代码清晰度以获得良好的可读性。