Newsgroup: it.comp.lang.javascript
Titolo: ordinare metodo sort ma non funziona bene

function compare(a,b){
		if( isNaN(a) ) 
		     { a=parseFloat(a) }
		else
			  {a=a.toString() }
 
		if( isNaN(b) )  
		     { b=parseFloat(b) }		
		else
			  {b=b.toString()}
 
 
		 if (a<b) return -1;
		 if (a>b) return 1;
		 return 0;
		}
in un array ho o un elenco di numeri o un elenco testo;
gli elementi dell'array sono comunque sempre stringhe;
volevo fare in modo riconoscendo quando ho i numeri di trasformarli in
numerieffettivie ed ordinarli numericamente;
lasciare le stringhe invece come stringhe ed ordinarle in modo alfabetico;
con il codice della funzione sopra usato per il sort pero' funziona 
solo con i numeri; quando nell'array vi sono solo elemti stringa testo
li ordina male (credo che senta il testo come un numero o meglio come
codice ascii) 

 			  {a=a.toString() }
forse qua sopra li hai invertiti? (se non è un numero fai parseFloat
altrimenti...?)
-- 
"Non sai che ci vuol scienza
 ci vuol costanza
 ad invecchiare senza maturità"
									    F.G.

 lasciare le stringhe invece come stringhe ed ordinarle in modo alfabetico;
Non puoi applicare quel tipo di ordinamento, rischi di fare un
confronto tra un numero e una stringa; e non ha molto senso.
Devi quindi applicare una regola, un peso. Visto che hai detto
di avere solo stringhe nell'array (che possono anche contenere
valori numerici, ma sempre stringhe sono):
function cmp(a,b){
	if ( !isNaN(a) ){
		a = +a;
		if ( isNaN(b) )
			return -1;
	}else if ( !isNaN(b) ){
		return 1;
	}
 
	if ( a > b )
		return 1;
	if (a < b)
		return -1
	else
		return 0;
}
Scritta *veramente* di corsa, visto che sono in ritardo.
-- 
~ "La realtà è ciò che, quando smetti di crederle, non va via."
(Philip K. Dick)

 altrimenti...?)
rimetto a stringa ;
comunque anche scrivendo solo
if( isNaN(a) ) 
     { a=parseFloat(a) }
non funziona ;
non so se l'if di prima è sbagliato ma anche in questo caso
dovrebbe mettere a numeri o lasciare come è : quindi stringa

 Scritta *veramente* di corsa, visto che sono in ritardo.
sei un mago comunque;
a livello di sintassi lasciato solo un ; creedo sul secondo return;
perň non funziona:
cioč ora ordinain modo alfabetico e non i numeri:
nb  quando in elenco mando solo numeri o solo parole come stringa
quind no in casi misti (non ho verificato)

 cioč ora ordinain modo alfabetico e non i numeri:
No, a occhio dovrebbe funzionare. Su che array l'hai testato?
-- 
~ Se i sintomi persistono, insultare il medico.

 No, a occhio dovrebbe funzionare. Su che array l'hai testato?
se l'array contiene tutti numeri non ordina;
se contiene tutte parole, ordina

 se contiene tutte parole, ordina
[12,89,0,11,10,87,1,20,2].sort(cmp)
// restituisce: 
// 0,1,2,10,11,12,20,87,89
["12","89","0","11","10","87","1","20","2"].sort(cmp)
// restituisce: 
// 0,1,2,10,11,12,20,87,89
["zuzzurro","assioma","9999","acqua","12","89","0","10.5","bar","11","10","87","1","20","2"].sort(cmp)
// restituisce:
// 0,1,2,10,10.5,11,12,20,87,89,9999,acqua,assioma,bar,zuzzurro
Direi che funziona. Quindi ripeto, su che array l'hai testato?


allora tutto ok funziona;
l'errore che facevo era che stavo ordinando in realtà
un array a 2 colonne, quindi nella funzione dovevo
aggiungere su a e b l'indice 0;
mi ha fatto quasi impazzire;
ringrazio di nuovo;

      { a=parseFloat(a) }
come sopra: "se *non* è un numero converti in numero"...
-- 
"Voi abili a tenere sempre un piede qua e uno là
 avrete un avvenire certo in questo mondo qua
 però la dignità
 dove l'avete persa?"
									    V.R.

 ringrazio di nuovo;
De nada, ciao
-- 
~ Plagiarism is copying from one source;
research is copying from two or more
(Wilson Mizner)

if ( !isNaN(a) &&  !isNaN(b) )
{
	a=parseFloat(a);
	b=parseFloat(b);		
}
 
if (a<b) return -1;
if (a>b) return 1;
return 0;
ora anche questo funziona m anon ho fatto test approfonditi;
una curiosità 
scrivere a=+a;
e a=parseFloat(a); 
è la stessa identica cosa oppure
ci sono differenze in particolari casi?


-- 
~ "E' impossibile svegliare chi fa finta di dormire."
(Proverbio navaho)


"Sono due cose diverse, parseFloat è un metodo, quello è un operatore.
Fa quello che hai chiesto, trasforma una stringa in numero."
ok volevo chiedere se nel trasformare una stringa in numero c'era qualche
differenza;
esempio se ho un stringa così -2334; o +2333 o 123.324
cioè per capire se sono proprio identici o c'erano delle eccezzioni;
perchè su qualche guida che ho letto non ho mai visto tale esempio;
quindi è sicuramente qualcosa da esperti che neanche sui libri è riportato

 quindi è sicuramente qualcosa da esperti che neanche sui libri è riportato
No, semplicemente le "guide" ignorano un sacco di cose. Inoltre,
l'operatore unario "+" a differenza della controparte "-", viene
ignorato in gran parte delle reference, quindi figurati se te lo
ritrovi in qualche guida.
