Как вы сортируете буквы в JavaScript, вместе взятые буквы и буквы?

Я работаю над JavaScript (jQuery OK тоже, если это ему нужно, но я сомневаюсь, что это будет), чтобы алфавит строки строки. Скажем, строка, которую я хочу сортировать, это: "ACBacb".

Мой код на данный момент:

var string='ACBacb';
alert(string.split('').sort().join(''));

Это возвращает ABCabc. Я понимаю, почему это происходит, но это не тот формат, который я ищу. Есть ли способ, которым я могу сортировать его, помещая одни и те же буквы рядом друг с другом, заглавную букву сначала? Итак, когда я добавляю ACBacb, я получаю AaBbCc?

Ответ 1

Array.sort может иметь функцию сортировки как необязательный аргумент.

Как насчет первой сортировки строки (ACBacbA становится AABCabc), а затем сортировки без учета регистра:

function case_insensitive_comp(strA, strB) {
    return strA.toLowerCase().localeCompare(strB.toLowerCase());
}

var str = 'ACBacbA';
// split the string in chunks
str = str.split("");
// sorting
str = str.sort();
str = str.sort( case_insensitive_comp )
// concatenate the chunks in one string
str = str.join("");

alert(str);

Согласно предложению Феликса, первая функция сортировки может быть опущена и объединена во второй. Во-первых, сделайте нечувствительное к регистру сравнение между обоими символами. Если они равны, проверьте их чувствительные к регистру эквиваленты. Возврат -1 или 1 для разницы и нуля для равенства.

function compare(strA, strB) {
   var icmp = strA.toLowerCase().localeCompare(strB.toLowerCase());
   if (icmp != 0) {
       // spotted a difference when considering the locale
       return icmp;
   }
   // no difference found when considering locale, let see whether
   // capitalization matters
   if (strA > strB) {
       return 1;
   } else if (strA < strB) {
       return -1;
   } else {
       // the characters are equal.
       return 0;
   }
}
var str = 'ACBacbA';
str = str.split('');
str = str.sort( compare );
str = str.join('');

Ответ 2

Вы можете передать пользовательскую функцию сравнения Array.sort()


Уже предоставленные ответы правы до сих пор, что вы должны использовать пользовательскую функцию сравнения. Однако вам нужно добавить дополнительный шаг для сортировки заглавных букв до нижнего регистра:

function cmp(x,y) {
    if(x.toLowerCase() !== y.toLowerCase()) {
        x = x.toLowerCase();
        y = y.toLowerCase();
    }
    return x > y ? 1 : (x < y ? -1 : 0);
    // or return x.localeCompare(y);
}

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

DEMO (на основе @Matt Ball версия)

Ответ 3

рабочий пример http://jsfiddle.net/uGwZ3/

var string='ACBacb';
alert(string.split('').sort(caseInsensitiveSort).join(''));

function caseInsensitiveSort(a, b)
{
   var ret = 0;
   a = a.toLowerCase();b = b.toLowerCase();
   if(a > b)
      ret = 1;
   if(a < b)
      ret = -1;
   return ret;
}

Ответ 4

Используйте специальную функцию сортировки, например:

function customSortfunc(a,b){ 
  var lca = a.toLowerCase(), lcb = b.toLowerCase();
   return lca > lcb ? 1 : lca < lcb ? -1 : 0;

}
var string='ACBacb';
alert(string.split('').sort(customSortfunc).join(''));

Подробнее о функции сортировки вы можете узнать здесь: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/sort

Остерегайтесь: если вы используете localeCompare, как и в другом ответе, "u" и "ü" будут отсортированы вместе как одна и та же буква, поскольку он игнорирует все диакритики.

Ответ 5

базовый пример для другой замены, в сочетании с нижним регистром: D

   

<button onclick="myFunction('U')">Try it</button>

<p id="demo"></p>

<script>
function myFunction(val) {
    var str = "HELLO WORLD!";
    var res = str.toLowerCase().split("o");
    var elem = document.getElementById("demo").innerHTML
    for(i = 0; i < res.length; i++){
        (i > 0)?elem += val + res[i]:elem += res[i];
    }
}
</script>