Javascript 计算对象属性,给出与点表示法不同的结果
我正在使用一个合并排序函数。当我对我试图使用的属性使用点符号时,它会对它们进行正确排序。我决定能够在其他属性上重用排序功能,因此我决定将该属性作为函数中的参数,而不是硬编码。问题是,当我将相同的属性传递给它时,项目排序不同。不知道为什么会这样 这是我根据points属性排序的对象数组Javascript 计算对象属性,给出与点表示法不同的结果,javascript,arrays,sorting,object,properties,Javascript,Arrays,Sorting,Object,Properties,我正在使用一个合并排序函数。当我对我试图使用的属性使用点符号时,它会对它们进行正确排序。我决定能够在其他属性上重用排序功能,因此我决定将该属性作为函数中的参数,而不是硬编码。问题是,当我将相同的属性传递给它时,项目排序不同。不知道为什么会这样 这是我根据points属性排序的对象数组 [ { teamNum: 0, points: 2, GD: -2, goals: 3, rank: 0 }, { teamNum: 1, points: 2, GD: -2, goals: 3, rank:
[ { teamNum: 0, points: 2, GD: -2, goals: 3, rank: 0 },
{ teamNum: 1, points: 2, GD: -2, goals: 3, rank: 0 },
{ teamNum: 2, points: 1, GD: -3, goals: 2, rank: 0 },
{ teamNum: 3, points: 4, GD: 1, goals: 4, rank: 0 },
{ teamNum: 4, points: 5, GD: 4, goals: 5, rank: 0 },
{ teamNum: 5, points: 4, GD: 2, goals: 6, rank: 0 } ]
工作合并排序功能:
*注意merge的if语句中的.points
function mergeSort(arr){
var len = arr.length;
if(len <2)
return arr;
var mid = Math.floor(len/2),
left = arr.slice(0,mid),
right =arr.slice(mid);
//send left and right to the mergeSort to break it down into pieces
//then merge those
return merge(mergeSort(left),mergeSort(right));
}
function merge(left, right){
var result = [],
lLen = left.length,
rLen = right.length,
l = 0,
r = 0;
while(l < lLen && r < rLen){
if(left[l].points < right[r].points){
result.push(left[l++]);
}
else{
result.push(right[r++]);
}
}
//remaining part needs to be addred to the result
return result.concat(left.slice(l)).concat(right.slice(r));
}
const Teams=[{teamNum:0,积分:2,GD:-2,目标:3,排名:0},
{teamNum:1,积分:2,GD:-2,目标:3,排名:0},
{teamNum:2,积分:1,GD:-3,目标:2,排名:0},
{teamNum:3,积分:4,GD:1,目标:4,排名:0},
{teamNum:4,积分:5,GD:4,目标:5,排名:0},
{teamNum:5,积分:4,GD:2,目标:6,排名:0}]
函数合并器{
var len=阵列长度;
如果len<2
返回arr;
var mid=数学。floorlen/2,
左=arr.0,中间,
右=arr.mid;
//将左侧和右侧发送到合并排序,将其分解为多个部分
//然后合并这些
返回mergesortleft、mergeSortright;
}
函数左,右{
var结果=[],
lLen=left.length,
rLen=右。长度,
l=0,
r=0;
而llet rankArr = mergeSort(Teams,"points").reverse();
但是您还需要将其传递给递归调用。改变
return merge(mergeSort(left),mergeSort(right), prop);
到
否则,在递归过程中,它将是未定义的,并且不会发生合理的排序
const Teams=[{teamNum:0,积分:2,GD:-2,目标:3,排名:0},
{teamNum:1,积分:2,GD:-2,目标:3,排名:0},
{teamNum:2,积分:1,GD:-3,目标:2,排名:0},
{teamNum:3,积分:4,GD:1,目标:4,排名:0},
{teamNum:4,积分:5,GD:4,目标:5,排名:0},
{teamNum:5,积分:4,GD:2,目标:6,排名:0}];
功能合并器,道具{
var len=阵列长度;
如果你能做到:
var arrayOfObjs=[{teamNum:0,积分:2,GD:-2,目标:3,排名:0},
{teamNum:1,积分:2,GD:-2,目标:3,排名:0},
{teamNum:2,积分:1,GD:-3,目标:2,排名:0},
{teamNum:3,积分:4,GD:1,目标:4,排名:0},
{teamNum:4,积分:5,GD:4,目标:5,排名:0},
{teamNum:5,积分:4,GD:2,目标:6,排名:0}];
var sorted=arrayOfObjs.slice;
排序。排序函数a,b{
返回b点-a点;
};
logsorted;谢谢!我记得使用动态版本底部的属性进行调用,但是我没有将它传递给函数中的递归调用left和right。
return merge(mergeSort(left),mergeSort(right), prop);
return merge(mergeSort(left, prop),mergeSort(right, prop), prop);