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

标签 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"]

谢谢! :)

最佳答案

通过使用 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);
}

在这里,我们在每个候选字体的名称排序数组中找到索引。将两个索引相减即可得到排序顺序。

关于javascript - 这是编写这种非数字/字母排序的最佳方式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10762566/

相关文章:

javascript - JavaScript 字符串的安全长度是多少?

regex - 为什么非捕获组(?:) seem to not be working?

c# - 在 C# 中创建动态字符串数组并通过循环将字符串(拆分方法的结果)添加到两个单独的数组中

Javascript 正则表达式 url 替换

java - 从一个数组复制到另一个数组的最佳方法

javascript - 服务器端 CSV 文件将其转换为 JavaScript 数组

javascript - 从下一个 div 的子元素中选择输入类型文本

Javascript 对象初始化不起作用

javascript - setFeatureState 不更新 Mapbox 中的值

javascript - 使用 Javascript RegExp 用迭代数字替换每个匹配项