Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/459.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 这是写这种非数字/字母排序的最好方法吗?_Javascript_Regex_Arrays_Sorting - Fatal编程技术网

Javascript 这是写这种非数字/字母排序的最好方法吗?

Javascript 这是写这种非数字/字母排序的最好方法吗?,javascript,regex,arrays,sorting,Javascript,Regex,Arrays,Sorting,我将各种样式的字体对象分组到数组中。每个字体对象都有一个属性sub_族,它可以是常规、斜体、粗体、粗体斜体(或某些变体,例如斜体有时称为斜体)。当它们从数据库中出来时,它们是以随机顺序排列的,需要按照上述方式进行排序;正则总是第一位,斜体总是第二位,等等 这是我正在使用的排序函数,它可以工作,但我想看看你们是否能想出更好的/替代的解决方案: // input: ["Bold Italic", "Regular", "Bold", "Italic"] sortFont = function

我将各种样式的字体对象分组到数组中。每个字体对象都有一个属性sub_族,它可以是常规、斜体、粗体、粗体斜体(或某些变体,例如斜体有时称为斜体)。当它们从数据库中出来时,它们是以随机顺序排列的,需要按照上述方式进行排序;正则总是第一位,斜体总是第二位,等等

这是我正在使用的排序函数,它可以工作,但我想看看你们是否能想出更好的/替代的解决方案:

// 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)$/

i标志导致regexp忽略字母字符的大小写。请注意,这将允许使用诸如正则或正则之类的名称,如果这会导致问题,请使用原始公式

然后替换

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

那个?使其前面的内容可选

如果字体名称始终一致,另一个选项如下:

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

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

使用i标志可以替换

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

i标志导致regexp忽略字母字符的大小写。请注意,这将允许使用诸如正则或正则之类的名称,如果这会导致问题,请使用原始公式

然后替换

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

那个?使其前面的内容可选

如果字体名称始终一致,另一个选项如下:

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

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

这里有一种更高效的方法,它还可以通过向表中添加条目来维护排序顺序:

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);
}

此处演示:

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

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);
}
此处演示: