0

さまざまなスタイルのフォントオブジェクトを配列にグループ化しています。各フォントオブジェクトには、Regular、Italic、Bold、Bold Italicのいずれかのプロパティsub_familyがあります(または、ItalicはObliqueと呼ばれることもあります)。それらがデータベースから出てくるとき、それらはランダムな順序であり、上記のようにソートする必要があります。レギュラーは常に最初、イタリックは2番目などです。

これが私が使用しているソート関数です、それは機能しますが、皆さんがより良い/代替の解決策を思い付くことができるかどうかを見たかったのです:

// 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"]

ありがとう!:)

4

2 に答える 2

2

iフラグを使用すると、置き換えることができます

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

/^(regular|normal)$/i

iフラグにより​​、正規表現は英字の大文字小文字を無視します。これにより、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);
}

ここでは、各候補フォントの名前のソートされた配列でインデックスを見つけます。2つのインデックスを引くと、ソート順がわかります。

于 2012-05-26T01:18:37.537 に答える
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/

于 2012-05-26T02:19:08.573 に答える