Javascript按长度不稳定排序数组

时间:2016-06-26 16:45:43

标签: javascript arrays sorting

我需要按字符串的长度对字符串数组进行排序,如果它们的长度相同,则将字符串保留为原始顺序。这是我的代码:

arr.sort(function(a, b) {
  return b.length - a.length;
});

直到具有相同长度的元素数量> 10,但之后排序方法的不稳定性改变了顺序。我试图找到一种方法来保持秩序相同,但我没有运气。有什么建议吗?

3 个答案:

答案 0 :(得分:1)

您必须对(element, index)对进行排序,而不是实际元素。这样你就可以稳定排序。

答案 1 :(得分:1)

arr.map(function(str, i){
    return {
        index: i,
        length: str.length,
        value: str
    }
}).sort(function(a, b){
    return b.length - a.length || a.index - b.index;
}).map(function(obj){
    return obj.value;
})

这看起来似乎有很大的开销,但是只要你不得不以某种方式计算你正在排序的值,计算它一次并将其存储到某个Object的速度要快一些,而不是将它计算在*(n- 1)操作。

因此,这种排序方法往往效率更高。

或者你通用化两个映射任务:

var valueIndex = function(value,index){ return {value:value,index:index} };
var getValue = function(obj){ return obj.value };

arr.map(valueIndex)
    .sort(function(a, b){ 
        return b.value.length - a.value.length || a.index - b.index
    })
    .map(getValue);

ES6

var valueIndex = (value,index) => { return {value,index} };
var getValue = ({value}) => value;

arr.map(valueIndex)
    .sort((a, b) => b.value.length - a.value.length || a.index - b.index)
    .map(getValue);

答案 2 :(得分:0)

您可以使用sorting with map,其中地图包含原始排序的长度和索引。

// the array to be sorted
var stringArray = ['Tom', 'Mia', 'Michael', 'Bob', 'Thomas', 'Joy'];

// temporary array holds objects with position and sort-value
var mapped = stringArray.map(function (el, i) {
    return { index: i, value: el.length };
});

// sorting the mapped array containing the reduced values
mapped.sort(function (a, b) {
    return b.value - a.value || a.index - b.index;
});

// container for the resulting order
var result = mapped.map(function (el) {
    return stringArray[el.index];
});

console.log(result);