Страницы

Поиск по вопросам

четверг, 19 декабря 2019 г.

Как отсортировать массив? Сначала латиница, потом кириллица, потом цифры

#javascript #массивы #сортировка


К примеру есть массив:

arr = ['б', 'D', 7, 'U', 'Ш', 9, 5, 'J']


А мне нужно отсортировать его по алфавиту, и привести к такому:

sort === ['D', 'J', 'U', 'б', 'Ш', 5, 7, 9];


Делаю так, но кириллица и цифры взваливают вперёд:

   let sort = arr.sort(function (a, b) {
            return a._id.toLowerCase().localeCompare(b._id.toLowerCase())
        });

    


Ответы

Ответ 1



Предлагаю еще один вариант: let arr = ['б', 'D', 7, 'U', 'Ш', 9, 5, 'J']; // если попалось число прибавим к нему 2000, иначе вернем код символа // коды английского алфавита находятся до 1000, кириллица после 1000, // а числа мы двигаем в диапазон 2000+ let c = a => 10 > a ? 2e4 + +a : a.charCodeAt(0); arr.sort((a, b) => c(a) - c(b)); console.log(JSON.stringify(arr));

Ответ 2



для сравнения букв в зависимости от языка можно использовать Intl.Collator с указанием нужной локали, в данном случае en, что бы латинские буквы были раньше кириллицы. Но цифры всё равно будут первыми, поэтому нужно на каждой итерации проверить варианты, когда один из аргументов число, а второй нет когда a НЕчисло и b число возвращаем -1, чтобы значения не менялись местами когда a число и b НЕчисло возвращаем 1, чтобы буква была раньше цифры в остальных случаях, когда оба параметра число или оба НЕчисло используем collator, чтобы отсортировать буквы и цифры между собой так же у Intl.Collator есть опция caseFirst, которая указывает символы какого регистра должны идти раньше const arr = ['б', 'D', 7, 'U', 'Ш', 9, 5, 'J'] const collator = new Intl.Collator('en'); const sortArr = arr.sort((a, b) => { if(isNaN(a) && !isNaN(b)){ return -1 }else if(!isNaN(a) && isNaN(b)){ return 1 } return collator.compare(a, b); }); console.log(sortArr);

Комментариев нет:

Отправить комментарий