2017-04-04 3 views
1

Ich habe eine Funktion geschrieben, die mit der Methode .sort() alphabetisiert. Derzeit funktioniert die Funktion nur mit Kleinbuchstaben. Wie würde ich diese Funktion korrigieren, so dass Großbuchstaben genauso behandelt werden wie Kleinbuchstaben? Zum Beispiel sortiert C vor a, was keinen Sinn macht.Alphabetisierung einer Zeichenfolge mit Großbuchstaben

Hier ist mein Code:

document.getElementById("btn").addEventListener('click', alphabetize); 
 
    
 
function alphabetize() { 
 
    var output; 
 
    var input = document.getElementById('input').value; 
 
    input = input.split('').sort().join(''); 
 
    output = input; 
 
    document.getElementById('output').value = output; 
 
}
<input type="text" id="input" /><br /> 
 
<input type="text" id="output" /><br /> 
 
    
 
<button id="btn">Alphabetize String </button> 

+1

fügen Sie bitte einige Beispiele als Eingabe und gewünschte Ausgabe hinzu. –

+0

Wenn ich meinen Namen Charlie eingib, gibt es folgendes aus: Caehilr – Brixsta

+1

Blick auf 'sort (compareFunction)' –

Antwort

2

Try this:

function alphabetize() { 
    var output; 
    var input = document.getElementById('input').value; 
    input = input.toLowerCase().split('').sort().join(''); 
    output = input; 
    document.getElementById('output').value = output; 
} 

//Input: "Charlie" 
//Output: "acehilr" 

https://jsfiddle.net/fdnnu8Ld/

0

Was Sie versuchen, Briefe von gemischten Fall zu tun ist, zu vergleichen und sortieren, aber was JavaScript tatsächlich tut, ist die Codepunktwerte der Buchstaben Unicode vergleichen und sortieren sie dementsprechend als zu vereinfachen, JavaScript doesn Ich weiß nicht, wie Charaktere miteinander verglichen werden - es ist leicht für das menschliche Gehirn zu sehen, dass "C" nach "a" kommen sollte, aber wie sollten Buchstaben aus verschiedenen Alphabeten oder sogar Nicht-Buchstaben-Symbolen miteinander verglichen werden?

Konvertieren Sie die Buchstaben des englischen Alphabets auf Zeichencodes, die Großbuchstaben AZ werden von 65-90 dargestellt und die Kleinbuchstaben az von 97-122 dargestellt werden, was erklärt, warum in Ihrem sort(), „C“ kommt vor "a" (67 < 97).

Was wir tun müssen, ist vergleichbar mit Gleichem, entweder alle Kleinbuchstaben oder alle Großbuchstaben. Die einfachste Möglichkeit wäre, Ihre Eingabezeichenfolge .toLowerCase oder .toUpperCase zu konvertieren, bevor Sie die sort()anwenden, aber Dies hat das unerwünschte Ergebnis, dass die Ausgabezeichenfolge in einem einzelnen Fall liegt und nicht im gemischten Fall der ursprünglichen Eingabe.

Die Lösung besteht daher darin, jedes Zeichen während des Vergleichs in den gleichen Fall zu konvertieren, wobei der ursprüngliche Fall unverändert bleibt.Wir tun dies, indem ein compareFunction zur sort() Methode übergeben, etwa so:

(function(){ 
 
    var output=function(input){ 
 
      return input.split("").sort(function(a,b){ 
 
       return a.toLowerCase()>b.toLowerCase(); 
 
      }).join(""); 
 
     }; 
 
    console.log(output("Charlie")); 
 
    console.log(output("Shaggy")); 
 
})();

Eine alternative Methode localeCompare() zu verwenden, wäre es, die zwei Zeichen ohne Fall Umwandlung zu vergleichen, die den zusätzlichen Vorteil hat in der Lage zu akzentuierte Zeichen zu vergleichen:

(function(){ 
 
    var output=function(input){ 
 
      return input.split("").sort(function(a,b){ 
 
       return a.localeCompare(b); 
 
      }).join(""); 
 
     }; 
 
    console.log(output("Charlie")); 
 
    console.log(output("Shaggy")); 
 
})();

Wenn ES6 eine Option für Sie ist, können Sie die spread operator verwenden, um die Zeichenfolge in einzelne Buchstaben und eine arrow function für die compareFunction, wie so aufgeteilt:

{ 
 
    const output=input=>[...input].sort((a,b)=>a.toLowerCase()>b.toLowerCase()).join(""); 
 
    /*ALTERNATIVES*/ 
 
    //const output=([...input])=>input.sort((a,b)=>a.localeCompare(b)).join(""); 
 
    //const output=input=>input.split``.sort((a,b)=>a.localeCompare(b)).join(""); 
 
    console.log(output("Charlie")); 
 
    console.log(output("Shaggy")); 
 
}

Hinweis: Ich habe angenommen, dass jede Manipulation von Zeichenfolgen (z. B. Beschneiden von Leerzeichen) und Überprüfungen (z. B. Zeichenfolgen mit Nulllänge, Nicht-Zeichen), die ausgeführt werden müssen, bereits Teil Ihres Codes sind.

Verwandte Themen