проблема сортировки массива с использованием JavaScript - PullRequest
0 голосов
/ 29 сентября 2018

Я пытаюсь отсортировать этот массив:

var arr = ["abc", "def", "1", "6", "4", "33", "10", "]", "20", "nike", "za", "(", "ABC"]; 

, и я хочу, чтобы результат сортировки был:

["1", "4", "6", "10", "20", "33", "ABC", "abc", "def", "nike", "za", "(", "]"] 

Я пробовал следующий код, но проблема заключается в«10» идет после «1».Я не могу решить эту проблему.кто-нибудь может помочь?

Ответы [ 3 ]

0 голосов
/ 29 сентября 2018

Это довольно сложный вид.Вы просите, чтобы числа сортировались низко и в порядке возрастания;это просто.Все остальное требует неестественной сортировки по возрастанию с несловесными символами в конце и символами слова, отсортированными с заглавной буквы, что является противоположным результатом localeCompare.

Вот решение "грубой силы", которое перечисляет каждую возможностьи обрабатывает их соответствующим образом:

var arr = ["1", "4", "abc", "Abc", "20", "33", "ABC", "abc", "def", "nike", "za", "(", "]","1","-123", "6", "10", "20", "33", "4", "6", "10", "20", "33", "ABC", "abcd", "DEf", "nike", "za", "(", "]", "abc", "def", "nike", "za", "(", "([", "]","1", "4", "6", "10", "20", "33", "ABC", "abc", "def", "nike", "za", "](", "[]]","1", "4", "6", "10", "20", "10","%","$", "ABC", "33", "XYZ", "abc", "def", "nike", "za", "(", "]", "a"];

arr.sort((a, b) => {
  if (a.match(/^-?\d+$/)) {
    return b.match(/^-?\d+$/) ? (+a) - (+b) : -1;
  }
  else if (a.match(/^\w+$/)) {
    if (b.match(/^-?\d+$/)) {
      return 1;
    }
    else if (b.match(/^\w+$/)) {
      if (a.match(/^[A-Z]/)) {
        if (b.match(/^[A-Z]/)) {
          const aLen = a.match(/^[A-Z]+/)[0].length;
          const bLen = b.match(/^[A-Z]+/)[0].length;
          
          if (aLen !== bLen) {
            return bLen - aLen;
          }

          return a.localeCompare(b);
        }
        
        return -1;
      }
      
      return b.match(/^[A-Z]/) ? 1 : a.localeCompare(b);
    }
    
    return -1;
  }
  else if (b.match(/^-?\d+$/) || b.match(/^\w+$/)) {
    return 1;
  }
  
  return a.localeCompare(b);  
});

console.log(arr);
0 голосов
/ 29 сентября 2018

Кажется, что вы можете решить большую часть этого с помощью options на localeCompare.Чтобы отсортировать не алфавитно-цифровые символы в последнюю очередь, вы можете добавить к выражению простое регулярное выражение:

var arr = ["abc", "def", "1", "6", "4", "33", "10", "]", "20", "nike", "za", "(", "ABC"]; 

let re = new RegExp('[0-9a-z]', 'i')
arr.sort((a,b) =>  
     (re.test(b) - re.test(a)) 
     || a.localeCompare(b, 'en', {numeric: true, caseFirst:"upper"}))

console.log(arr)
0 голосов
/ 29 сентября 2018

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

var array = ["abc", "def", "1", "6", "4", "33", "10", "]", "20", "nike", "za", "(", "ABC"],
    pattern = [                    // revers sorted
        c => /^[^a-z]*$/i.test(c), // all except letters
        c => /^[a-z]*$/.test(c),   // only lower letters
        c => /^[A-Z]*$/.test(c),   // only upper letters
    ],
    result = array
        .map((value, index) => /\d/.test(value)
            ? { index, value }
            : { index, value: Array.from(value, c => pattern.map(fn => fn(c) ? c : ' ').join('')).join('') }
        )
        .sort(({ value: a }, { value: b }) => isNaN(a) - isNaN(b) || a - b || a.localeCompare(b))
        .map(el => array[el.index]);

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