簡體   English   中英

JavaScript自定義排序功能,用於確定字母的優先級

[英]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);

http://jsfiddle.net/ryanbrill/RqfgL/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM