排序另一个数组后无法访问任何数组

时间:2016-04-12 06:44:32

标签: javascript sorting multidimensional-array

我遇到了一个非常奇怪的错误: 我从另一个(allSavings[])派生出一个新数组tours[],并在函数calculateAllSavings()中对其进行排序。在我调用该函数之前,我可以访问tours[]就好了,但之后,我再也不能了。 div标签demo1demo2都存在,并且可以正常用于其他输出。

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()覆盖了原始的tour []。 通过与克隆游览相结合,原来没有被打开。

function combineTours(tourA, tourB){
    var tour1 = tourA.slice(0);
    var tour2 = tourB.slice(0);
    tour1.pop();
    tour2.shift();
    return tour1.concat(tour2);
}

感谢所有帮助过我的人

1 个答案:

答案 0 :(得分:1)

你能试试吗?

for(var i = 0; i < tours.length; i++){
        for(var j = 0; j < tours[i].length; j++){
            if(i != j)
            var savingObj = {saving:calculateSaving(tours[i],tours[j]), tourA: i, tourB: j};
                allPossibilities.push(savingObj);
        }
    }

除此之外,您还可以调试并查看您的document.getElementById(“demo2”)。innerHTML = tours.join('\ n');线实际上被执行了。您可能正在运行无限循环。使用chrome开发人员工具尝试并调试您的代码。