[英]JavaScript custom sort function to prioritize a letter
我已經有一個排序數組(最多可以包含1,000個項目),我只想獲取以指定字符開頭的項目塊並將它們移到頂部。
// Before sort
{ "alpha", "beta", "delta", "delta frequency", "gamma", "theta" }
// After sort with "d" as the specified letter
{ "delta", "delta frequency", "alpha", "beta", "gamma", "theta" }
我不熟悉JavaScript,知道一個很好的方法來做到這一點。 我的第一個想法是迭代每個項目,看看指定的起始字符的索引是否為“0”,以找到第一個和最后一個數組索引,並將該范圍移動到數組的頂部,但這似乎可能是浪費。 有沒有更好的辦法?
var array = [ "alpha", "beta", "delta", "delta frequency", "gamma", "theta" ];
var startingWithD = array.filter(function(s) {
return s[0] == "d";
});
var others = array.filter(function(s) {
return s[0] != "d";
});
array = startingWithD.concat(others);
這是一個選項:
function sortWithPriority(arr, letter) {
var numFound = 0,
i = arr.length,
cur;
while (i-- > numFound) {
cur = arr[i];
if (cur.charAt(0).toLowerCase() === letter.toLowerCase()) {
arr.unshift(arr.splice(i, 1)[0]);
numFound++;
i++;
}
}
}
演示: http : //jsfiddle.net/kU8wK/
它將刪除以指定字母開頭的任何項目,並將其移動到數組的開頭。 所以數組就地修改了。
它可以很容易地修改,以允許傳遞項目必須開始的字符串(而不僅僅是一個字母)。
更新:
至於性能,當談到這個問題的當前答案時,這種方法似乎最快。
這是我做的性能測試: http : //jsperf.com/sort-with-letter-priority
它使用一個按字母順序排列數百個項目的數組(測試用例大於10個左右)。 它可能不是生成數組的最佳方法,但它可以正確執行,並且該部分與實際時序無關(它在時間之外運行)。
請注意,我的函數被修改為不使用toLowerCase
,因此在將第一個字母與目標字母進行比較時,所有函數應該“相等”。 當然,如果你希望它是更准確,在的情況下,該數組中的項目的第一個字母可能是大寫(或你傳遞一個大寫字母),你必須使用toLowerCase
上都得到准確的比較。 對於性能測試,我忽略了所有測試用例的可能性。
這是一個排序算法,它實際上將以“d”開頭的數組加權字符串排序。 請注意,我已經重新排列了開始數組,以顯示排序正常工作。
array = [ "beta", "alpha", "delta frequency", "delta 2", "delta 1", "delta", "gamma", "theta" ];
array.sort(function(a,b) {
if (a[0] == "d" && b[0] != "d") {
return -1
}
if (b[0] == "d" && a[0] != "d") {
return 1;
}
return a > b;
});
console.log(array);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.