这是写这种非数字/字母排序的最佳方式吗?

时间:2012-05-25 23:57:22

标签: javascript regex arrays sorting

我有各种样式的字体对象分组到数组中。每个字体对象都有一个属性sub_family,它是Regular,Italic,Bold,Bold Italic(或者某些变体,例如Italic有时称为Oblique)。当它们从数据库中出来时,它们是随机顺序,需要按照上面的顺序排序;常规总是第一,斜体第二,等等。

这是我使用的排序功能,它有效,但我想知道你们是否可以提出更好/替代解决方案:

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

谢谢! :)

2 个答案:

答案 0 :(得分: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);
}

这里我们在每个候选字体的名称的排序数组中找到索引。减去这两个索引可以提供排序顺序。

答案 1 :(得分: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/