Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/416.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 编写递归if语句的更好方法_Javascript - Fatal编程技术网

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

Javascript 编写递归if语句的更好方法,javascript,Javascript,我偶尔会发现自己处于这样的位置,我相信有一种比现在更好的方法来做到这一点 在本例中,我试图对有冲突项的一组时间进行排序。我需要知道什么时候是高优先级,不能移动,什么时候是低优先级,可以移动。 但我很确定这段代码效率很低 var holdLowPriorities = []; for (conflict = 0; conflict < sortedTimes.length - 1; conflict++) { var firstConflictTimeStart = sortedT

我偶尔会发现自己处于这样的位置,我相信有一种比现在更好的方法来做到这一点

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

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
        }
    }
}
var-holdLowPriorities=[];
对于(冲突=0;冲突secondConflictTimeStart){
//这两种冲突中有一种是高度优先的吗
var firstContactPriority=sortedTimes[冲突][2];
var secondContactPriority=ortedTimes[conflict+1][2]
如果(firstConflictPriority==2){
//这是高优先级,无法移动
}
如果(secondConflictPriority==2){
//这也是一个优先事项,但必须采取行动
}
//这两个冲突中有一个优先级较低吗?
如果(firstConflictPriority==0){
//这是一个低优先级,因此我可以调整时间
}else if(secondConflictPriority==0){
//这是一个低优先级,因此我可以调整时间
}
}
}

不幸的是,我甚至不知道该如何称呼这种类型的问题,因此也不知道该寻找什么,尽管我确信答案不会过于复杂(我希望无论如何都不会)

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

就数据结构而言,if..else块本身并没有什么低效之处。即使嵌套,如果..否则也不是问题。就可读性而言,这完全是另一回事。根据经验,如果..else块很大且嵌套很深,则很难遵循(对于人来说,计算机当然没有问题)

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

其次,使用数组文字语法而不是
newarray()
holdLowPriorities.push([…])
。同样,屏幕上的噪音越小,越容易看到正在发生的事情

第三,在一些地方,你所做的只是检查某件事情的优先级。使用帮助函数或方法简化此处的代码:
checkProirity(sortedTimes,conflict,2)
sortedTimes.checkProirity(conflict,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);
}
var-holdLowPriorities=[];

对于(conflict=0;conflict=nextConflictTime[1]| | conflictTime[1],您可以使代码更易于阅读(并且可能更高效)通过使用一些具有准确名称的中间变量,
sortedTimes
的结构是什么?哇,这是一个很难维护的代码块…10/10是为了改进它…你一定要听从Mitch Wheat的建议-一旦你得到了中间变量,用更新的代码编辑你的Q。仅供记录:th没有所谓的“递归”if语句另外:制表符在Stackoverflow markdown中工作不太好-请确保将代码转换为空格缩进。然后他将不得不编写多个switch语句,因为出于某种原因,他的if语句中有多个变量。此外,他将仅限于字符串值,而不限于条件。javascript中不是这种情况,switch state如果他写了一个足够聪明的表达式,他甚至可以在一个switch语句中修改它。=)switch语句确实使代码更具可读性。谢谢。谢谢你,斯莱贝特曼,我在你发帖的时候已经更改了密码。我删除了“新数组”的内容,因为它实际上不是这个问题的一部分。使用辅助函数是一种解决方案,但我希望正确的答案比仅仅从辅助函数获取另一个变量要好。但也许这就是答案。谢谢Chris,我发现很有趣的是,大多数建议都是关于代码可读性的,而不是关于编写代码的不同方式,一个我不知道的函数(除了switch)或类似的东西。也许我并不像我想象的那样是个糟糕的程序员,只是对难看的代码喋喋不休。
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);
}