javascript - jämföra 2 strängar alfabetiskt för sorteringsändamål
Jag försöker jämföra 2 strängar alfabetiskt för sorteringsändamål. Till exempel vill jag ha en boolean kontroll som if('aaaa' < 'ab'). Jag försökte, men det ger mig inte korrekt resultat, så jag antar att det inte är rätt syntax. Hur gör jag detta i jQuery eller Javascript?
Svar #1
Du säger att jämförelsen är för sorteringsändamål. Då föreslår jag localeCompare istället:
"a".localeCompare("b");
Det returnerar -1 eftersom "a" < "b", 1 eller 0 annars, som du behöver för Array.prototype.sort()
Tänk på att sorteringen beror på plats. Till exempel är ä på tyska en variant av a, så "ä".localeCompare("b", "de-DE") returnerar -1. På svenska är ä en av de sista bokstäverna i alfabetet, så "ä".localeCompare("b", "sv-SE") returnerar 1.
Utan den andra parametern till localeCompare används webbläsarens lokalisering. Vilket enligt min erfarenhet aldrig är vad jag vill, eftersom det då kommer att sortera annorlunda än servern, som har en fast lokalisering för alla användare.
Om det du sorterar också innehåller siffror, kanske du vill:
"a5b".localeCompare("a21b", undefined, { numeric: true })
Detta returnerar -1, vilket indikerar att 5 som ett tal är mindre än 21. Utan { numeric: true } returnerar det 1, eftersom "2" sorteras före "5". I många verkliga tillämpningar förväntar sig användare att "a5b" ska komma före "a21b".
Svar #2
Låt oss titta på några testfall - försök köra följande uttryck i din JS-konsol:
"a" < "b"
"aa" < "ab"
"aaa" < "aab"
Alla returnerar sant.
JavaScript jämför strängar tecken för tecken och "a" kommer före "b" i alfabetet - därför är det mindre än.
I ditt fall fungerar det så här -
1 . "aaaa" < "ab"
jämför de två första "a"-tecknen - alla lika, låt oss gå vidare till nästa tecken.
2 . "aaaa" < "ab"
jämför den andra karaktären "a" med "b" - whoop! "a" kommer före "b". Returnerar sant.
Svar #3
Kom bara ihåg att strängjämförelse som "x" > "X" är skiftlägeskänslig
"aa" < "ab" //true
"aa" < "Ab" //false
Du kan använda .toLowerCase() för att jämföra utan skiftlägeskänslighet.
Svar #4
Låt oss säga att vi har en array av objekt såsom:
{ name: String }
då kan vi sortera vår array på följande sätt:
array.sort((a, b) => {
if (a.name === b.name) return 0;
return a.name > b.name ? 1 : -1;
});
Obs: Var försiktig med versaler. Du kan behöva konvertera din sträng till gemener beroende på syftet.
