我正在寻找一种最简单的方法来排序由数字和文本组成的数组,以及这些数组的组合.
例如
'123asd'
'19asd'
'12345asd'
'asd123'
'asd12'
Run Code Online (Sandbox Code Playgroud)
变成
'19asd'
'123asd'
'12345asd'
'asd12'
'asd123'
Run Code Online (Sandbox Code Playgroud)
这将与我在这里提出的另一个问题的解决方案结合使用.
排序函数本身就可以工作,我需要的是一个可以说'19asd'小于'123asd'的函数.
我是用JavaScript编写的.
编辑:正如adormitu指出的那样,我正在寻找的是一种自然分类的功能
我想排序一个字符串数组(在javascript中),使得字符串中的数字组比较为整数而不是字符串.我并不担心签名或浮点数.
例如,结果应该["a1b3","a9b2","a10b2","a10b11"]不是["a1b3","a10b11","a10b2","a9b2"]
最简单的方法似乎是在数字组周围的边界上拆分每个字符串.是否有一个模式,我可以传递给String.split分割字符边界而不删除任何字符?
"abc11def22ghi".split(/?/) = ["abc","11","def","22","ghi"];
或者是否有另一种方法来比较不涉及拆分它们的字符串,也许通过用前导零填充所有数字组,使它们的长度相同?
"aa1bb" => "aa00000001bb", "aa10bb" => "aa00000010bb"
我正在使用任意字符串,而不是具有特定数字组排列的字符串.
编辑:
我喜欢/(\d+)/盖比的一个班轮来拆分阵列.如何向后兼容?
以可用于重建原始文件的方式解析字符串一次的解决方案比此比较函数更有效.没有一个答案处理一些以数字开头的字符串而其他字符串不处理,但这很容易补救,并且在原始问题中没有明确说明.
["a100","a20","a3","a3b","a3b100","a3b20","a3b3","!!","~~","9","10","9.5"].sort( function ( inA , inB ) {
var result = 0;
var a , b , pattern = /(\d+)/;
var as = inA.split( pattern );
var bs = inB.split( pattern );
var index , count = as.length;
if ( ( '' === as[0] ) === ( '' === bs[0] ) ) {
if ( count > bs.length …Run Code Online (Sandbox Code Playgroud) 我有一系列学校成绩,如下所示
(注意'N'代表没有等级,'K'代表幼儿园)
const toSort = ['1','3','4','5','6','7','9','10','11','12','K','2 ", 'N', '8'];
使用javascript sort()方法我想安排数组,使它看起来像
const sorted = ['K','1','2','3','4','5','6','7','8','9','10','11 ",'12' , 'N'].
这是我的尝试:
const toSort = ['1', '3', '4', '5', '6', '7', '9', '10', '11', '12', 'K', '2', 'N', '8'];
toSort.sort();
// Produces: ["1", "10", "11", "12", "2", "3", "4", "5", "6", "7", "8", "9", "K", "N"]
const test = toSort.sort((a, b) => {
if (a === 'K') {
return -1;
}
return Number(a) < Number(b) ? -1 : Number(a) > Number(b) ? 1 …Run Code Online (Sandbox Code Playgroud)