【发布时间】:2016-04-12 06:44:32
【问题描述】:
我遇到了一个很奇怪的bug:
我从另一个数组(tours[])派生了一个新数组allSavings[],并在函数calculateAllSavings() 中对其进行排序。在调用该函数之前,我可以访问 tours[] 就好了,但之后,我就不能了。 div 标签demo1 和demo2 都存在并且对于其他输出都可以正常工作。
function euclDist(node1,node2){
if(node1 != node2){
var x = Math.pow(nodes[node2].x - nodes[node1].x,2);
var y = Math.pow(nodes[node2].y - nodes[node1].y,2);
var dist = Math.sqrt(x+y);
return dist;
}
else return 0.0;
}
function tourDist(members){
var tourDist = 0.0;
if (members.length>1){
for (i = 1; i < members.length; i++)
tourDist += euclDist(members[i],members[i-1]);
}
return tourDist;
}
function combineTours(tourA, tourB){
tourA.pop();
tourB.shift();
return tourA.concat(tourB);
}
function calculateSaving(tourA,tourB){
var costSeparate = tourDist(tourA) + tourDist(tourB);
var combTour = combineTours(tourA,tourB);
var costCombined = tourDist(combTour);
return costSeparate - costCombined;
}
function calculateAllSavings(){
var allPossibilities = [];
for(var i = 0; i < tours.length; i++){
for(var j = 0; j < tours.length; j++){
if(i != j)
var savingObj = {saving:calculateSaving(tours[i],tours[j]), tourA: i, tourB: j};
allPossibilities.push(savingObj);
}
}
allPossibilities.sort(function(a, b){
return b.saving-a.saving
})
document.getElementById("demo3").innerHTML = "success";
return allPossibilities;
}
//Initialize Array
var tours = [];
tours.push([0,1,2,3,0]);
tours.push([0,4,5,6,0]);
tours.push([0,7,8,0]);
tours.push([0,9,10,0]);
//BUG
document.getElementById("demo1").innerHTML = tours.join('\n'); // Shows array correctly
var allSavings = calculateAllSavings(); //BUG APPEARS HERE
document.getElementById("demo2").innerHTML = tours.join('\n'); // Doesn't show anything
编辑解决: combine() 覆盖了原来的 tours[]。 通过与克隆之旅的结合,原版保持不变。
function combineTours(tourA, tourB){
var tour1 = tourA.slice(0);
var tour2 = tourB.slice(0);
tour1.pop();
tour2.shift();
return tour1.concat(tour2);
}
感谢所有帮助过我的人
【问题讨论】:
-
能否请您附上
tourDist函数的代码? -
另外,你应该总是在条件后面加上
{}来编写你的 if 语句,即使它是单行的。 -
@Gothdo 他的代码确实换行了(好吧,他故意把它放在下一行),因此我的评论。
-
感谢您的回复。我添加了方法tourDist() 和euclDist()。抱歉格式不好,这是一次性使用的hacky代码,所以不需要可维护性......我怀疑它是缺少括号
标签: javascript sorting multidimensional-array