Сортировка массива строк по символам в алфавитном или числовом - PullRequest
0 голосов
/ 08 октября 2018

Итак, у меня есть массив строк для сортировки.

Допустим, у меня есть этот массив:

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 }

И затем заменить все символы в любом порядке.У кого-нибудь есть более простой или эффективный способ добиться того, что нужно сделать?

Ответы [ 3 ]

0 голосов
/ 08 октября 2018

Попробуйте использовать parseInt() функцию с аргументом radix для перевода вашей строки в числовое значение.

Также .sort() метод для сортировки массива.

Пример:

let array = ["8AB", "8A6", "8BC", "86F", "835", "81D", "22", "33", "0"];
array.sort((x,y) => parseInt(x, 32) - parseInt(y, 32));
console.log(array);
0 голосов
/ 08 октября 2018

Вот некоторые общие / абстрактные вещи

// 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])))
0 голосов
/ 08 октября 2018

Подход с просмотром каждой буквы и шаблоном для сортировки по карте .

function sort(array, pattern) {
    return array
        .map((value, index) => ({ index, value: Array.from(value, c => pattern.map(fn => fn(c) ? c : ' ').join('')).join('') }))
        .sort(({ value: a }, { value: b }) => a.localeCompare(b))
        .map(({ index }) => array[index]);
}

const
    isDigit = c => /^\d$/.test(c),
    isNonDigit = c => /^\D$/.test(c),
    digitNonDigit = [isNonDigit, isDigit], // revers sorted
    nondigitDigit = [isDigit, isNonDigit], // revers sorted
    array = ["8AD", "8AB", "8A6", "8BC", "86F", "835", "81D"];

console.log(sort(array, digitNonDigit));
console.log(sort(array, nondigitDigit));
.as-console-wrapper { max-height: 100% !important; top: 0; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...