我偶尔会发现自己处于这个位置,而且我确信有比现在更好的方法。
在这个例子中,我试图对一组有冲突的项目进行排序。我需要知道什么时候是高优先级,不能移动,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
}
}
}
不幸的是,我甚至不知道该怎么称呼这类问题,因此不知道该找什么,但我确信答案并不过分复杂(我希望不管怎么说)。
答案 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)
。同样,函数/方法调用本质上效率较低,但重点是提高代码清晰度以获得良好的可读性。