我在JavaScript中有一组对象。我想按特定指标对它们进行排序。在特殊情况下,度量标准每次都具有相同的值。这是一个示例数组:
var myArray = [{"key":400686,"metric":999999},{"key":52601288,"metric":999999},{"key":1380180030,"metric":999999},{"key":909661,"metric":999999},{"key":401336,"metric":999999},{"key":1317275,"metric":999999},{"key":8642696,"metric":999999},{"key":1374360020,"metric":999999},{"key":602871933,"metric":999999},{"key":410174,"metric":999999},{"key":503411,"metric":999999},{"key":401511,"metric":999999},{"key":410196,"metric":999999},{"key":419377,"metric":999999},{"key":429167,"metric":999999},{"key":609656,"metric":999999},{"key":837941,"metric":999999},{"key":2410791,"metric":999999},{"key":4501004,"metric":999999},{"key":8633371,"metric":999999},{"key":1356540155,"metric":999999},{"key":1374360757,"metric":999999}];
当我做一些像这个电话一样简单的事情时:
myArray.sort( function( a, b ){ return 0; } );
数组被排序!显然应该单独使用,因为sort函数中的返回值0表示相等。
还有其他人遇到过这个问题吗?
答案 0 :(得分:4)
0表示相等,这意味着元素是可互换的。这并不意味着他们不会四处走动。这意味着它们可以自由交换或保持原样,数组仍将被排序。
答案 1 :(得分:3)
发生这种情况是因为排序不稳定,它不一定保留相等项的相对顺序。
您可以使用stable sorting算法,例如merge sort。
答案 2 :(得分:1)
如果您希望将相同的元素分类为可预测的顺序,那么您需要一个辅助密钥,以便您可以识别哪个相同的元素应该在另一个之前。在您的示例数组中,您可以使用这样的自定义排序函数,它首先按公制排序,如果它们相同,则按键排序:
myArray.sort( function( a, b ){
if (a.metric != b.metric) {
return(b.metric - a.metric);
}
// when metrics are the same, sort by key as secondary sort
return(b.key - a.key)
});
或者,如果您想保留相同元素的现有订单,则每次排序前都需要快速传递以添加订单值:
// mark each value with it's current position in the array
for (var i = 0; i < myArray.length; i++) {
myArray[i].sortIndexForTies = i;
}
myArray.sort( function( a, b ){
if (a.metric != b.metric) {
return(b.metric - a.metric);
}
// when metrics are the same, sort by the original array position as second sort key
return(b.sortIndexForTies - a.sortIndexForTies)
});
答案 3 :(得分:0)
我找到了一个很好的解决方法,我通过在我关心的参数精度之外的排序参数上添加delta来偏向排序。偏差使得阵列倾向于保持相同的顺序。如果距离中存在单个差异单位(我的精度在1s位置),则该元素将被正确排序。
for( var i = 0, len = myArray.length, delta = 0; i < len; i++, delta += 0.000001 )
{
myArray[ i ].metric -= delta;
}
function byMetric( a, b )
{
return b.metric - a.metric;
}
myArray.sort( byMetric );