2012-05-25 74 views
0

我有不同風格的字體對象分組到數組中。每個字體對象都有一個屬性sub_family,它可以是Regular,Italic,Bold,Bold Italic(或某些變體,例如Italic,有時也稱爲斜體)。當它們從數據庫中出來時,它們是隨機排列的,需要像上面那樣排序;經常永遠是第一,第二斜體等這是編寫這種非數字/字母排序的最佳方式嗎?

下面是我使用的排序功能,它的工作原理,但我想看看你們能想出更好的/替代解決方案:

// input: ["Bold Italic", "Regular", "Bold", "Italic"]  
sortFont = function(a, b) { 
    // regular 
    if (/^([Rr]egular|[Nn]ormal)$/.test(a.sub_family)) { return -1; } 
    if (/^([Rr]egular|[Nn]ormal)$/.test(b.sub_family)) { return 1; } 
    // italic 
    if (/^([Ii]talic|[Ii]nclined|[Ii]t|[Oo]blique|[Oo]bl)$/.test(a.sub_family)) { return -1; } 
    if (/^([Ii]talic|[Ii]nclined|[Ii]t|[Oo]blique|[Oo]bl)$/.test(b.sub_family)) { return 1; } 
    // bold 
    if (/^([Bb]old|[Bb]d)$/.test(a.sub_family)) { return -1; } 
    if (/^([Bb]old|[Bb]d)$/.test(b.sub_family)) { return 1; } 
} 
// output: ["Regular", "Italic", "Bold", "Bold Italic"] 

感謝! :)

回答

1

下面是做這件事的大規模更有效的方式,也可以讓你只需將條目添加到表維護它:

sortKeys = { 
    "regular": 1, 
    "normal": 2, 
    "italic": 10, 
    "inclined": 11, 
    "oblique": 12, 
    "bold": 20, 
    "bold italic": 30 
}; 

function sortFont(a, b) { 
    var aKey = sortKeys[a.sub_family.toLowerCase()] || 100; 
    var bKey = sortKeys[b.sub_family.toLowerCase()] || 100; 
    return(aKey - bKey); 
} 

演示在這裏:http://jsfiddle.net/jfriend00/MB76R/

2

通過使用I標誌,你可以用

/^(regular|normal)$/i 

I標誌使正則表達式來忽略字母字符替換的情況下

/^([Rr]egular|[Nn]ormal)$/ 

。請注意,這將允許像REGULAR或ReGuLaR這樣的名稱,如果這會導致問題,請使用您的原始配方。

然後更換

/^([Ii]talic|[Ii]nclined|[Ii]t|[Oo]blique|[Oo]bl)$/ 

/^(it(alic)?|inclined||obl(ique)?)$/i 

的?使之前可選。

另一種選擇,如果您的字體的名稱總是一致的,如下:

var sorted = ["Regular", "Italic", "Bold", "Bold Italic"]; 
function sortFont (a, b) { 
    return sorted.indexOf (a) - sorted.indexOf (b); 
} 

在這裏我們發現在每個candiate字體名稱的排序數組的索引。減去兩個索引提供排序順序。

相關問題