javascript - 按字母或数字字符对字符串数组进行排序

标签 javascript sorting

所以我有一个字符串数组需要整理。

假设我有这个数组:

let array = ["8AD", "8AB", "8A6", "8BC", "86F", "835", "81D"];

现在,有两种排序需要实现:

  1. 字母字符优先于数字字符
  2. 数字字符优先于字母字符

现在,我需要对每个字符使用这两个中的任何一个进行排序。

因此,数字-数字-字母顺序会给我:

"81D","835","86F","8AB","8AD","8A6","8BC"

虽然数字-字母-数字顺序会给我:

"8A6","8AB","8AD","8BC","81D","835","86F"

我正在考虑将每个单个数字和所有字符分配给一个两位数的整数:

let alpha = {
    A= 11, B= 12 , C= 13 , D= 14 , E= 15 , F= 16 , G= 17 , H= 18 , I= 19 , J= 20 , K= 21,
    L= 22 , M= 23 , N= 24 , O= 25 , P= 26 , Q= 27 , R= 28 , S= 29 , T= 30 , U= 31 , V= 32,
    W= 33 , X= 34 , Y= 35 , Z= 36 , 0=37, 1= 38 , 2= 39 , 3= 40 , 4= 41 , 5= 42 , 6= 43 , 7= 44,
    8= 45 , 9= 46 };
let numeral = {
    0=11, 1=12, 2=13, 3=14, 4=15, 5=16, 6=17, 7=18, 8=19, 9=20, A=21, 
    B=22, C=23, D=24, E=25, F=26, G=27, H=28, I=29, J=30, K=31, L=32, 
    M=33, N=34, O=35, P=36, Q=37, R=38, S=39, T=40, U=41, V=42, W=43, 
    X=44, Y=45, Z=46 }

然后将每个字符替换为所需的顺序。 有没有人有更简单或更有效的方法来实现需要做的事情?

最佳答案

这是一些通用/抽象的东西

// given a sequence and an array of "order" strings, create a comparable "key" string

let multiSortKey = (subject, orders) =>
    [...subject].map(
        (c, i) =>
            String(orders[i].indexOf(c)).padStart(16, '0')
    ).join();


// generic comparison function

let cmp = (a, b) => (a > b) - (a < b);

// generic sort-by-map, aka Schwartzian, function

let sortBy = (xs, key) => xs
    .map(x => [x, key(x)])
    .sort((x, y) => cmp(x[1], y[1]))
    .map(x => x[0]);


// applied to the task at hand:

data = ["8AD", "8AB", "8A6", "8BC", "86F", "835", "81D"]

N = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
A = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'

console.log(sortBy(data, x => multiSortKey(x, [N, N, A])))
console.log(sortBy(data, x => multiSortKey(x, [N, A, N])))

关于javascript - 按字母或数字字符对字符串数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52700037/

相关文章:

javascript - 递归 Switch 语句

javascript - 如何使用 jQuery 选择在 <text> 中具有特定文本的特定 <g> 作为其子级?

python - 按缺少某些项目的值对字典列表进行排序

c++ - 在 C++ 中对字符 vector 进行排序并将大写和小写字母视为相等的最佳方法?

c++ - 如何将 sort() 的比较参数与模板和自定义数据结构一起使用

javascript - 如何让时间计数器即使刷新或离开页面也会继续

javascript - 无法在html中为文本框加水印

javascript - 为什么跟踪代码管理器未检测到我的数据层?

MySQL - 在 WHERE 子句中按日期排序

linux - 在每个部分的标题中按 (DOW MON DD YY) 日期对分成多个部分的文件进行排序