Newsgroup: it.comp.lang.javascript
Titolo: ordinare un array a tre colonne

se ho un array semplice
1
4
2
6
per ordinare si usa:
arrayOrdinato=arraySemplice.sort();
ed avrò
1
2
4
6
ma se l'array non è semplice
1,auto,blu
4,libro,rosso
2,casa,verde
6,bici,rosa
come si fa ad ordinare solo in base alla prima colonna in modo da avere 
1,auto,blu
2,casa,verde
4,libro,rosso
6,bici,rosa

 6,bici,rosa
da
http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:sort
vedi che il metodo sort accetta un parametro: una funzione di confronto.
In questo caso la tua funzione di confronto potrebbe essere
function compare(a, b) {
   if (a[0]<b[0])
     return -1;
   else if (a[0]>b[0])
     return 1;
   else
     return 0;
}
(in pratica controlla solo il primo elemento)
Oppure può essere estesa per avere anche sottoordinamenti (nel caso di 2 
elementi uguali per il primo valore, ma differenti per gli altri 2)
A questo punto invochi myarr.sort(compare).
Luca

 (in pratica controlla solo il primo elemento)
questa è una funzione se non erro per ordinare in modo numerico ma per
ordinare invece in modo alfabetico?
cioà la classica arry.sort(); credo faccia un ordine alfabetico,
ma non ho la possibilità di agire se ho piu' colonne;
qual'è la sua function compare?

 qual'è la sua function compare?
Non credo che la sua compare lavori strettamente in modo alfabetico (non mi 
sembra), ma sul valore interpretato del singolo record (dovrebbe utilizzare i 
semplici < e > ).
Se confronti 2 e "a" viene fatto un confronto alfabetico, tra "35" e "4" un 
confronto alfabetico, tra 35 e 4 dovrebbe essere numerico (sarebbe da controllare).
Per forzare un confronto alfabetico, quindi di stringhe, basta che forzi 
l'interpretazione come stringhe.
Quindi a[0].toString() < b[0].toString() dovrebbe fare un confronto alfabetico
intValue(a[0],10) < intValue(b[0],10), invece, numerico intero (interpretando il 
numero in base 10, considera che "010" sarebbe 8 in ottale :-) )
Luca

 intValue(a[0],10) < intValue(b[0],10), 
Immagino tu intendessi parseInt :) Consiglierei l'uso dell'operatore
unario "+" in questo caso, comunque. Inoltre ricorda che se converti
una stringa in numero, č molto facile che tu ottenga un "NaN", ed il
paragone tra numeri e NaN non ha molto senso.
-- 
~ Se i sintomi persistono, insultare il medico.

 
Sì, a memoria non mi ricordo mai in nomi delle funzioni :-P
Lcua

</select></td>
</tr>
</table>
<br>
<input type="button" name="puls" value="TEST3" onClick="stest3()"
/><br><br><br>
<br><br>
<!--
############################################################################################
-->
<!--
############################################################################################
-->
</form>
</BODY>
</html>



come viene la funzione finale?



avere per lo meno __bb e _casa subito dopo i nomi con i punti;
l'unica che piu' si avvicina puoi vedere nbell'esempio che allego č la
funzione a-b;
inoltre se nell'array ho 005 006 007  a video vengono solo i numeri 5 6 7
(questa č una simulazione,
a me serve per fare un ordine di file e cartelle; non so se poi se ho file
chiamati cosi es: 005 poi a video mette solo 5 etc..)
la soluzione piů vicna al tipo di oprdine che vorrei avere e' quell che usa
un compare a-b
ti invio pagina di test
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"
http://www.w3.org/TR/html4/loose.dtd
">
<html>
<head>
<title>Documento senza titolo</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<script type="text/javascript">
// 
//


//sort normale
var order01=new Array();
order01=myarray_base0.sort();


var order01bb=new Array();
order01bb=myarray_base0.sort(sort2);


var order01bbb=new Array();
order01bbb=myarray_base0.sort(sort3);



// 
// 
// 
// 


//sort normale
var order01=new Array();
order01=myarray_base0.sort();


var order01bb=new Array();
order01bb=myarray_base0.sort(sort2);


var order01bbb=new Array();
order01bbb=myarray_base0.sort(sort3);



// 
//
</script>
</head>
<BODY>
<form name="formbas" action="" method="post">
<!--   -->
<!--   -->

<td>sort default</td>
<td>a-b</td>


</tr>





</tr>
</table>

<br><br>
<!--  ----- -->

<td>sort default</td>
<td>a-b</td>


</tr>





</tr>
</table>

<br><br>
<!--   -->
<!--   -->
</form>
</BODY>
</html>

perchè se applico la stessa regola per ordinare ad una colnna sola il
risulato è diverso se invece tale colonna è la prima di un array?
volevo avere anche sul sort multiple un ordinamento come per
la colonna sort simple
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"
http://www.w3.org/TR/html4/loose.dtd
">
<html>
<head>
<title>Doc</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<script type="text/javascript">
// 
// 
function test3()
{
   var cont_3a0=document.formbas.cont_3a0 ; var
cont_3a1=document.formbas.cont_3a1 ; var cont_3a2=document.formbas.cont_3a2
; 
 
	var cont_3b0=document.formbas.cont_3b0 ; var
cont_3b1=document.formbas.cont_3b1 ; var cont_3b2=document.formbas.cont_3b2
;
	var cont_3bb0=document.formbas.cont_3bb0 ; var
cont_3bb1=document.formbas.cont_3bb1 ; var
cont_3bb2=document.formbas.cont_3bb2 ;
	var cont_3bbb0=document.formbas.cont_3bbb0 ; var
cont_3bbb1=document.formbas.cont_3bbb1 ; var
cont_3bbb2=document.formbas.cont_3bbb2 ;
	var cont_3bbbb0=document.formbas.cont_3bbbb0 ; var
cont_3bbbb1=document.formbas.cont_3bbbb1 ; var
cont_3bbbb2=document.formbas.cont_3bbbb2 ;
   //var myarray_base0= new
Array(10,16,35,"0,1",8,4,22,19,1,4,-4,-8,-2,22,35,9,26,38,40);
	// var myarray_base0= new
Array(10,8,1,"_casa","__bb",'002','003','004',005,006,007,".thumb","._thumb",'auto','-parc0','bici','0_auto','BICI','CASA','casa');
 
	 var myarray_base0= new
Array(10,8,1,"_house","__bb",'002','003','004',005,006,007,".test","._test",'autoveicle','-park','bicycle','0_car','BICYCLE','HOUSE','house');
 
 
   var myarray_base1= new
Array('a','b','c','d','e','f','g','h','i','l','m','n','o','p','q','r','s','t','u','v');
   var myarray_base2= new
Array('aa','bb','cc','dd','ee','ff','gg','hh','ii','ll','mm','nn','oo','pp','qq','rr','ss','tt','uu','vv'
);
//0
cont_3a0.options.length=0;
		var x=0;
		for (var i = 0; i<myarray_base0.length; i++)	
		{ cont_3a0.options[x++]=new Option( myarray_base0[i]); }	
//1
cont_3a1.options.length=0;
		var x=0;
		for (var i = 0; i<myarray_base1.length; i++)	
		{ cont_3a1.options[x++]=new Option( myarray_base1[i]); }	
//2		
cont_3a2.options.length=0;
		var x=0;
		for (var i = 0; i<myarray_base2.length; i++)	
		{ cont_3a2.options[x++]=new Option( myarray_base2[i]); }				
 
 
 //
===================================================================================================================
// SORT    NORMAL
var order01=new Array();
order01=myarray_base0.sort();
 cont_3b0.options.length=0;
		var x=0;
		for (var i = 0; i<order01.length; i++)	
		{ cont_3b0.options[x++]=new Option( order01[i]); }			
 
//sort a-b 
 function sort0(a,b)
{
a - b;
}
var order01bb=new Array();
order01bb=myarray_base0.sort(sort0);
 cont_3bb0.options.length=0;
		var x=0;
		for (var i = 0; i<order01bb.length; i++)	
		{ cont_3bb0.options[x++]=new Option( order01bb[i]); }			
 
 //
===================================================================================================================
// SORT   WITH   MULTICOLUMN
 function sort2(a,b)
{
a[0] - b[0];
}
var arrayTotale=new Array();
   for (var i = 0; i <myarray_base0.length; i++)
	        {
           arrayTotale[i]=new Array();
				    arrayTotale[i][0]=myarray_base0[i];
				    arrayTotale[i][1]=myarray_base1[i];
                arrayTotale[i][2]=myarray_base2[i];
				}	 
 
 
 
 
 
var order01bb=new Array();
order01bb=arrayTotale.sort(sort2);
 cont_3bb0.options.length=0;
 cont_3bb1.options.length=0;
 cont_3bb2.options.length=0;
		var x=0;
		for (var i = 0; i<arrayTotale.length; i++)	
		{ cont_3bb0.options[x++]=new Option( order01bb[i][0]); 
		  cont_3bb1.options[x++]=new Option( order01bb[i][1]); 
		  cont_3bb2.options[x++]=new Option( order01bb[i][2]);
		 		}			
}
</script>
</head>
<BODY>
<form name="formbas" action="" method="post">
<!--  -->
<!--  -->
<table border="1">
<tr>
<td>List </td><td></td><td></td>
<td>a-b simple </td>
<td></td><td></td>
<td>a-b multipl </td>
<td></td><td></td>
</tr>
<tr>
<td><select  name="cont_3a0" size="22" style="width:100px" ></select></td>
<td><select  name="cont_3a1" size="22" style="width:50px" ></select></td>
<td><select  name="cont_3a2" size="22" style="width:50px" ></select></td>
<td><select  name="cont_3b0" size="22" style="width:100px" ></select></td>
<td><select  name="cont_3b1" size="22" style="width:50px" ></select></td>
<td><select  name="cont_3b2" size="22" style="width:50px" ></select></td>
<td><select  name="cont_3bb0" size="22" style="width:100px" ></select></td>
<td><select  name="cont_3bb1" size="22" style="width:50px" ></select></td>
<td><select  name="cont_3bb2" size="22" style="width:50px" ></select></td>
</tr>
</table>
<br>
<input type="button" name="puls" value="TEST3" onClick="test3()"
/><br><br><br>
<br><br>
<!--   -->
<!--   -->
<br><br>
</form>
</BODY>
</html>