JavaScript [] .sort()方法在应该单独留下元素时进行排序

时间:2011-12-17 02:06:31

标签: javascript sorting

我在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表示相等。

还有其他人遇到过这个问题吗?

4 个答案:

答案 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 );