【问题标题】:Is this the best way to write this non-numerical/alphabetical sort?这是编写这种非数字/字母排序的最佳方式吗?
【发布时间】:2012-05-25 23:57:22
【问题描述】:

我将各种样式的字体对象分组到数组中。每个字体对象都有一个属性 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"]

谢谢! :)

【问题讨论】:

    标签: javascript regex arrays sorting


    【解决方案1】:

    通过使用 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】:

      这是一种更高效的方法,您只需向表中添加条目即可对其进行维护:

      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/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-08-12
        • 1970-01-01
        • 2011-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多