Javascript 按每个对象具有的属性对对象数组排序时出现异常结果

Javascript 按每个对象具有的属性对对象数组排序时出现异常结果,javascript,arrays,object,sorting,Javascript,Arrays,Object,Sorting,我试图按照每个对象所具有的属性rank对对象数组进行排序。这似乎是公认的做法。然而,它似乎没有正常工作 var waypoints = ig.game.getEntitiesByType(EntityWaypoint); // returns array of objects // This line tells sort to order by Array[i].rank waypoints.sort(function(a,b) {return (a.rank < b.rank) ? -

我试图按照每个对象所具有的属性
rank
对对象数组进行排序。这似乎是公认的做法。然而,它似乎没有正常工作

var waypoints = ig.game.getEntitiesByType(EntityWaypoint); // returns array of objects
// This line tells sort to order by Array[i].rank
waypoints.sort(function(a,b) {return (a.rank < b.rank) ? -1 : (a.rank > b.rank) ? 1 : 0;});
waypoints.sort();
for( var i=0; i<waypoints.length; i++ ) {
    console.log(waypoints[i].rank);
}
我还尝试了以下变化,结果也是一样的

waypoints.sort(function(a,b) {return (parseInt(a.rank) < parseInt(b.rank)) ? -1 : (parseInt(a.rank) > parseInt(b.rank)) ? 1 : 0;});
waypoints.sort(函数(a,b){return(parseInt(a.rank)parseInt(b.rank))?1:0;};

为什么这不能按每个对象的
rank
属性对对象数组进行正确排序?

。您的第一段代码调用了两次
waypoints.sort()
。第二类是扰乱秩序;卸下它。

。您的第一段代码调用了两次
waypoints.sort()
。第二类是扰乱秩序;删除它。

您应该能够只执行
返回a.rank-b.rank
,将强制将
rank
转换为数字(如果可以)。
waypoints.sort(函数(a,b){返回a.rank-b.rank;})似乎有效,但我不知道为什么。这种方法是只适用于数字还是适用于文字?对于某些版本的“工作”,是的,但可能不是你所期望的。上面的评论与内部算法和特殊处理有关联。基本上,如果字符串转换为数字文字(例如“12”->
12
),则会发生这种情况。其他字符串(例如“foo”->
NaN
)则不是这样。您应该能够只执行
返回a.rank-b.rank
,将强制将
rank
转换为数字(如果可以)。
waypoints.sort(函数(a,b){返回a.rank-b.rank;})似乎有效,但我不知道为什么。这种方法是只适用于数字还是适用于文字?对于某些版本的“工作”,是的,但可能不是你所期望的。上面的评论与内部算法和特殊处理有关联。基本上,如果字符串转换为数字文字(例如“12”->
12
),则会发生这种情况。其他字符串(例如“foo”->
NaN
)不是这样。效果很好,谢谢!虽然排序一个排序的数组可能会取消排序,但这似乎很奇怪……因为第一个排序是对数字进行排序,第二个排序是对对象进行排序。算法在。工作得很好,谢谢!虽然排序一个排序的数组可能会取消排序,但这似乎很奇怪……因为第一个排序是对数字进行排序,第二个排序是对对象进行排序。该算法已在运行中。
waypoints.sort(function(a,b) {return (parseInt(a.rank) < parseInt(b.rank)) ? -1 : (parseInt(a.rank) > parseInt(b.rank)) ? 1 : 0;});