我需要按字符串的长度对字符串数组进行排序,如果它们的长度相同,则将字符串保留为原始顺序。这是我的代码:
arr.sort(function(a, b) {
return b.length - a.length;
});
直到具有相同长度的元素数量> 10,但之后排序方法的不稳定性改变了顺序。我试图找到一种方法来保持秩序相同,但我没有运气。有什么建议吗?
答案 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);