排序数组时遇到问题。我目前正在尝试优化自己玩的策略游戏中的内容,为此,我需要计算联盟中所有成员之间,第一个与其他成员之间的距离,等等。实际上没问题。但是现在,我要对距离数组“升序”进行排序,问题是,我需要写相应的昵称来匹配距离。我已经搜寻了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>');
});
});
答案 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>')
})