Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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_Sorting - Fatal编程技术网

对字符串的JavaScript数组进行排序,并对第一个字符中的标点符号进行自定义排序

对字符串的JavaScript数组进行排序,并对第一个字符中的标点符号进行自定义排序,javascript,sorting,Javascript,Sorting,我有一个JavaScript字符串数组: var nick=[“~xxx”、“@blue”、“&demo”、“+voice”、“%yyy”, “nick1”、“Nick2”、“网站管理员”]; 我想对这些字符串进行排序,使结果按以下顺序排列: ~xxx&demo@blue%yyy+voice nick1 Nick2网站管理员 如何执行此操作?您可以使用正则表达式和localeCompare()函数,对于不区分大小写的比较,请添加两个小写: var nick = ["~xxx", "@blue

我有一个JavaScript字符串数组:

var nick=[“~xxx”、“@blue”、“&demo”、“+voice”、“%yyy”,
“nick1”、“Nick2”、“网站管理员”];
我想对这些字符串进行排序,使结果按以下顺序排列:

~xxx&demo@blue%yyy+voice nick1 Nick2网站管理员

如何执行此操作?

您可以使用正则表达式和localeCompare()函数,对于不区分大小写的比较,请添加两个小写:

var nick = ["~xxx", "@blue", "&demo", "+voice", "%yyy", "nick1", "Nick2", "webmaster"];
nick.sort(function(a,b){
    return a.toLowerCase().replace(/[^\w\s]/gi, '').localeCompare(b.toLowerCase().replace(/[^\w\s]/gi, ''));
});
console.log(nick); // ["@blue", "&demo", "nick1", "Nick2", "+voice", "webmaster", "~xxx", "%yyy"]

乍一看,这有点棘手。但这里有一种方法,假设您只关心列出的特殊字符:

var分隔符='\uFFFF';
变量前缀={
'~': '1',
'&': '2',
'@': '3',
'%': '4',
'+': '5'
};
函数特殊排序(数组){
var前缀=array.map(函数(值){
var prefix=前缀[value.charAt(0)]| |“9”;
返回前缀+
value.toLowerCase()+
分隔符+值;
});
前缀为.sort();
返回带前缀的.map(函数(值){
返回值.拆分(分隔符)[1];
});
}
变量nicks=[“~xxx”、“@blue”、“&demo”、“+voice”、“%yyy”、“nick1”、“Nick2”、“网站管理员”];
var排序=特殊排序(nicks);
控制台日志(已排序);
代码的工作方式是创建一个新数组,其中字符串的格式如下:

  • 第一个字符是数字1-5(表示特殊字符),或9(表示在每个字符串开头找到的任何其他字符)。(您可以使用“01”、“02”等将其扩展为两位数,其他字符使用“99”将其扩展为两位数。)
  • 接下来是小写的字符串
  • 然后是一个Unicode字符,带有一个非常大的值(
    \uFFFF
    )作为分隔符
  • 最后是原始字符串
  • 然后可以直接对这些字符串的数组进行排序,通过在该分隔符上拆分字符串并使用分隔符后面的部分(原始字符串),将结果转换为新数组

    或者,使用排序回调函数的更简单方法:

    var前缀={
    '~': '1',
    '&': '2',
    '@': '3',
    '%': '4',
    '+': '5'
    };
    函数特殊排序(数组){
    返回array.sort(函数(a,b){
    a=(前缀[a.charAt(0)]| |“9')+a.toLowerCase();
    b=(前缀[b.charAt(0)]| |“9')+b.toLowerCase();
    返回ab-1:0;
    });
    }
    变量nicks=[“~xxx”、“@blue”、“&demo”、“+voice”、“%yyy”、“nick1”、“Nick2”、“网站管理员”];
    var排序=特殊排序(nicks);
    控制台日志(已排序);
    
    对于长数组,我倾向于使用第一种方法制作一个修改过的数组并对其进行排序,因为它比使用排序回调更快。但是排序回调稍微简单一点,对于这种大小的数组,它没有什么问题

    与修改后的数组相比,排序回调方法还有另一个优点:它不依赖于稍微粗糙的分隔符

    无论哪种方式,输出都是:

    [“~xxx”、“&demo”、“@blue”、“%yyy”、“+voice”、“nick1”、“Nick2”、“网站管理员”]
    

    这是a和a。

    你试过什么?请参见,您可以为Array.prototype.sort提供自己的排序功能。您的
    控制台.log
    输出是否与OP请求的顺序相同?此代码按字母顺序对数组排序,排序时只忽略前导的特殊字符。