字符串和整数数组排序

时间:2019-01-10 12:42:47

标签: javascript

排序数组时遇到问题。我目前正在尝试优化自己玩的策略游戏中的内容,为此,我需要计算联盟中所有成员之间,第一个与其他成员之间的距离,等等。实际上没问题。但是现在,我要对距离数组“升序”进行排序,问题是,我需要写相应的昵称来匹配距离。我已经搜寻了2天,却找不到有效的解决方案。

我试图在对数组进行排序之前先对其进行复制,但是我需要未排序的数组,并且具有该sort函数,它也可以对副本进行排序! 实际上,所提供的代码不错,说到距离精度,但排序没有上升。如果我对距离进行排序,则昵称不再对应。我不知道为什么它们按伪列表的顺序出现,因为它应该通过nSort2()进行排序 到目前为止,这就是我要结束的事情:

//Sorting Distance[i] Array List
function nSort(arr) 
{
  return arr.sort((a, b) => a - b);
}

//Calculating Distance
function calcDist(xA, yA, xB, yB)
{
    return Math.sqrt(Math.pow((xB-xA), 2)+Math.pow((yB-yA), 2));
}

 //Here i'm trying to retrieved unsorted position of distance by index to sort the nicknames by their respective distances
function nSort2(arr_str, arr_nbr)
{
    var arr_nbr2 = arr_nbr.splice(0);
    var arr_sort = nSort(arr_nbr2);
    var str_sort = [];

    arr_str.forEach(function(element, i) 
    {
        j = arr_sort.indexOf(arr_nbr2[i], i);
        str_sort[i] = arr_str[j];
    });
    console.log(str_sort);
    return str_sort;
}

var pseudo_list = ["teddy95", "gabrielc", "ngozi"]; //The list (I just put the first 3 to not to write to much unnecessary code)
var x_ = [29, 26, 4]; // The X Coordinate list
var y_ = [519, 461, 143]; // The Y Coordinate list
var distance = [[]]; // The 2D Array for distance (distance[0][0] being the member's distance tower himself (which is obviously 0).

//Calculating Distances And Storing them in the 2D Array
y_.forEach(function(element, i) 
{
    distance[i] = [];
    x_.forEach(function(element, j) 
    {
        distance[i][j] = Math.ceil(calcDist(x_[i], y_[i], x_[j], y_[j]));
    });
});

//Displaying Sorted Array ascending (Trying)
y_.forEach(function(element, i) 
{
    x_.forEach(function(element, j) 
    {
            document.write(pseudo_list[i] + ' -> ' + nSort2(pseudo_list, distance[i])[j] + ': ' + distance[i][j] + '<br>');
    });
});

1 个答案:

答案 0 :(得分:2)

我认为您的问题来自使数据结构复杂化(我不是在侮辱您只是在分享意见)。

在下面的代码中,所有输入(伪,x,y)都存储在一个对象中,因此播放器数据更易于操作。 然后,我不使用矩阵,因为您最终会产生新的问题,即我期望distance [1] [2] = distance [2] [1],因此排序将创建重复的结果(对角线对它代表与自己的距离)。相反,我构造了一个没有重复的一维数组,即它包含从第一个元素到所有其他元素(即第二个,第三个,...)的距离,然后是第二个元素从“右边的一个”(即第三个元素)的距离,第四,...),... 一旦获得了所有距离信息,排序就是一项简单的任务,因此要显示结果。

        //Calculating Distance
        function calcDist(xA, yA, xB, yB) {
            return Math.sqrt(Math.pow((xB - xA), 2) + Math.pow((yB - yA), 2));
        }

        let players = [{
            pseudo: "teddy95",
            x: 29,
            y: 519
        },
        {
            pseudo: "gabrielc",
            x: 26,
            y: 461
        },
        {
            pseudo: "ngozi",
            x: 4,
            y: 143
        }]

        let distances = []

        players.forEach(function (element, i) {
            for (let j = i + 1; j < players.length; ++j) {
                distances.push({
                    player1: element,
                    player2: players[j],
                    distance: Math.ceil(calcDist(element.x, element.y, players[j].x, players[j].y))
                })
            }
        })

        distances.sort(function (a, b) { return a.distance - b.distance })

        distances.forEach(function (element, i) {
            document.write(element.player1.pseudo + ' - ' + element.player2.pseudo + ' dist ' + element.distance + '<br>')
        })