2013-11-20, 20:25
  #1
Medlem
Antag att du har en array

Kod:
var foo = new Array("Å", "Ä", "Ö", "å", "ä", "ö");

som du sedan vill sortera...

Kod:
foo.sort();

...och sedan skriva ut

Kod:
for(var i=0; i<foo.length; i++)
{
     document.write(foo[i]);
}

Hur gör man för att detta ska fungera för svenska tecken?
Citera
2013-11-20, 20:44
  #2
Medlem
cyberbanans avatar
Skriv en egen sorteringsfunktion som kan hantera åäö.
Citera
2013-11-20, 22:26
  #3
Medlem
Povels avatar
Så här kan du göra:

[PHP]
var foo = ["Å", "Ä", "Ö", "å", "ä", "ö"].sort(String.localeCompare);
// => ["å", "Å", "ä", "Ä", "ö", "Ö"]
[/PHP]

/p
__________________
Senast redigerad av Povel 2013-11-20 kl. 22:35. Anledning: Add spoiler around quote
Citera
2013-11-20, 23:57
  #4
Medlem
Citat:
Ursprungligen postat av Povel
Så här kan du göra:

[PHP]
var foo = ["Å", "Ä", "Ö", "å", "ä", "ö"].sort(String.localeCompare);
// => ["å", "Å", "ä", "Ä", "ö", "Ö"]
[/PHP]

/p

Tack Povel!
Citera
2013-11-21, 11:06
  #5
Medlem
Povels avatar
Citat:
Ursprungligen postat av Povel
Så här kan du göra:

[PHP]
var foo = ["Å", "Ä", "Ö", "å", "ä", "ö"].sort(String.localeCompare);
// => ["å", "Å", "ä", "Ä", "ö", "Ö"]
[/PHP]

/p

Men.. det verkar vara trasigt i webkit, så himla dumt. Det är ju detta localeCompare skall fixa

I t.ex. Chrome kommer alla ü och sådant sist bara, och inte direkt i svensk ordning ens (för åäö). Bu för webkit.

Det blir till att skriva något eget antar jag (en egen funktion som du ger som parameter till sort alltså - den får två saker ur arrayen att jämföra, och man returnerar -1, 0 eller 1 beroende på hur man vill att just de två objekten skall sorteras sinsemellan).

/p
Citera
2013-11-22, 17:51
  #6
Medlem
cyberbanans avatar
Citat:
Ursprungligen postat av Povel
Men.. det verkar vara trasigt i webkit, så himla dumt. Det är ju detta localeCompare skall fixa

I t.ex. Chrome kommer alla ü och sådant sist bara, och inte direkt i svensk ordning ens (för åäö). Bu för webkit.

Det blir till att skriva något eget antar jag (en egen funktion som du ger som parameter till sort alltså - den får två saker ur arrayen att jämföra, och man returnerar -1, 0 eller 1 beroende på hur man vill att just de två objekten skall sorteras sinsemellan).

/p

Ordningen är väl helt enkelt ASCII-tabellen (eller unicode ellr nåtliknande). Därför är det ju inget fel i att åäö inte sorteras rätt. Det är ju elementens numeriska värde som jämförs. Det värdet är ju samma som positionen i tabellen.

Vad är det som säger att localeCompare skulle göra på nåt annat sätt?
Citera
2013-11-22, 18:33
  #7
Medlem
Povels avatar
Citat:
Ursprungligen postat av cyberbanan
Ordningen är väl helt enkelt ASCII-tabellen (eller unicode ellr nåtliknande). Därför är det ju inget fel i att åäö inte sorteras rätt. Det är ju elementens numeriska värde som jämförs. Det värdet är ju samma som positionen i tabellen.

Vad är det som säger att localeCompare skulle göra på nåt annat sätt?

Det är det som locale-sensitiva funktioner brukar vara till till för - hantera olika valutor, teckenuppsättningar, formatteringskonventioner osv. Därav namnet.

Synd att inte fler implementationer verkar orka bry sig.

/p
Citera
2013-11-22, 19:14
  #8
Moderator
vhes avatar
Citat:
Ursprungligen postat av Povel
Det är det som locale-sensitiva funktioner brukar vara till till för - hantera olika valutor, teckenuppsättningar, formatteringskonventioner osv. Därav namnet.

Synd att inte fler implementationer verkar orka bry sig.

/p

Funkar fint i min chrome. Miljö:
Kod:
$ env | grep -E '(LANG|LC_)'
LC_ALL=sv_SE.UTF-8

Sortering:
Kod:
["a", "å", "ä", "e", "ë", "o", "ö", "u", "ü", "x", "y", "z"].sort(function(a, b) { return a.localeCompare(b) })
["a", "e", "ë", "o", "u", "x", "y", "ü", "z", "å", "ä", "ö"]

Är du säker på att du inte missförstår localCompares interface, helt enkelt? Den tar inte två strängar som argument. Det är en instansmetod i en sträng som tar en annan sträng som argument.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/localeCompare

Antar att sorteringen inte implementeras i browsern, oavsett. Det lär väl delegeras till av OS:et tillhandahållna bibliotek.
Citera
2013-11-22, 21:41
  #9
Medlem
Som vhe skrev, tror jag att JavaScript liksom alla andra scriptspråk helt enkelt använder standard C-funktionerna för lokalisering, som väl är det rätta sättet att göra det, och att eventuella problem egentligen beror på operativsystemet som finns bakom. OpenBSD stödjer t.ex. bara LC_CTYPE, inget mer, så inga program eller interpreters sorterar ÅÄÖ korrekt, inte ens ett så grundläggande program som `sort`, såvida de inte har en egen sorteringsfunktion.
Citera
2013-11-22, 22:10
  #10
Medlem
Povels avatar
Citat:
Ursprungligen postat av vhe
Funkar fint i min chrome. Miljö:
Kod:
$ env | grep -E '(LANG|LC_)'
LC_ALL=sv_SE.UTF-8

Sortering:
Kod:
["a", "å", "ä", "e", "ë", "o", "ö", "u", "ü", "x", "y", "z"].sort(function(a, b) { return a.localeCompare(b) })
["a", "e", "ë", "o", "u", "x", "y", "ü", "z", "å", "ä", "ö"]

Är du säker på att du inte missförstår localCompares interface, helt enkelt? Den tar inte två strängar som argument. Det är en instansmetod i en sträng som tar en annan sträng som argument.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/localeCompare

Antar att sorteringen inte implementeras i browsern, oavsett. Det lär väl delegeras till av OS:et tillhandahållna bibliotek.


Nej, den jag förslog är ingen instansmetod. Det är skillnad på metoderna "".localeCompare (om du nämnde) och String.localeCompare. Den senare är generisk och tar två argument, se:

[PHP]
"".localeCompare.length; // 1
String.localeCompare.length; // 2
[/PHP]

Tyvärr verkar den bara finnas i Firefox, så i t.ex. Webkitfallet blev det då lika med att skicka in undefined => blä.

localeCompare har över huvud taget varit underspecificerad verkar det. Men bara att den finns (och har det namnet) ger en vink om att den skall (bör) göra annat än att sortera enligt ascii-koder. Det skulle ju vara en helt vanlig numerisk sort, sånt finns redan.

Nu i lite modernare tider är det tydligen specat att man skall kunna skicka med bl.a. en locale, tidigare var det inte specat vad den skulle göra (men vad tusan borde den göra? sortera som nummer? )

Firefox har i alla fall String.localeCompare med arity 2 som är utmärkt att skicka in till "äüaåöi".sort(). I t.ex. Chrome tycks den som sagt göra rätt om man åbäkar sig ock skickar in function (s0, s1) { return s0.localeCompare(s1); }.

/p
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in