Foros del Web » Programando para Internet » Javascript »

ordenar array manteniendo ciertos elementos

Estas en el tema de ordenar array manteniendo ciertos elementos en el foro de Javascript en Foros del Web. Quiero ordenar un array de menor a mayor. Ok, esto es facil. Me creo un criterio de ordenacion tal que asi: Código PHP: function  desorden_aleat ...
  #1 (permalink)  
Antiguo 18/08/2005, 22:44
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
ordenar array manteniendo ciertos elementos

Quiero ordenar un array de menor a mayor. Ok, esto es facil. Me creo un criterio de ordenacion tal que asi:
Código PHP:
function desorden_aleat(a,b) {
    if(
a<b) return -1;
    else if(
a>b) return 1;
    else return 
0;

Y funciona.

Ahora quiero que se "salte" ciertos elementos. Es decir, que si un elemento por ejemplo es "-1", que mantenga su posicion. Pensaba que era tan facil como hacer:
Código PHP:
function desorden_aleat(a,b) {
    if(
a==-|| b==-1) return -1;
    if(
a<b) return -1;
    else if(
a>b) return 1;
    else return 
0;

Pero no funciona.

La verdad, he estado devanándome lo sesos para hacerlo, pero no encuentro solución.

Este es mi codigo de ejemplo completo:
Código PHP:
var a1=[1,3,-1,8,-1,2,5,9,3];
var 
a2=[2,-1,6,2,4,5,-1,2,-1];
function 
desorden_aleat(a,b) {
    if(
a==-|| b==-1) return -1;
    if(
a<b) return -1;
    else if(
a>b) return 1;
    else return 
0;
}


document.write(a1+"<br>");
a1.sort(desorden_aleat);
document.write(a1+"<br><br>");


document.write(a2+"<br>");
a2.sort(desorden_aleat);
document.write(a2); 
Los "-1" deben mantener su posicion, y los demas elementos ordenarse como su los "-1" no existieses.

¿Alguna ayuda?

__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #2 (permalink)  
Antiguo 22/08/2005, 08:51
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
Pues nada, la solución la saque metiendo un poco mas de tiempo...

Código PHP:
var a1=[1,3,-1,8,-1,2,5,9,3]; 
var 
a2=[2,-1,6,2,4,5,-1,2,-1]; 
function 
desorden_aleat(a,b) { 
    if(
a<b) return -1
    else if(
a>b) return 1
    else return 
0


function 
guardarMenosUno(arr) {
    var 
dev=new Array();
    for(var 
a=0a<arr.lengtha++) {
        if(
arr[a]==-1) {
            
dev[dev.length]=[aarr[a]];
            
//alert("Hay un -1 en "+a);
        
}
    }
    return 
dev;
}
function 
eliminarMenosUno(arr) {
    for(var 
a=0a<arr.lengtha++) {
        if(
arr[a]==-1) {
            
arr.splice(a,1);
            
a--;
        }    
    }
}
function 
restaurarMenosUno(arrarrMenosUno) {
    for(var 
a=0;a<arrMenosUno.length;a++) {
        
//alert("Añadimos "+arrMenosUno[a][1]+" en "+arrMenosUno[a][0]);
        
arr.splice(arrMenosUno[a][0],0,arrMenosUno[a][1]);
    }
}

function 
ordenar(arr) {
    var 
arr_menosUno=guardarMenosUno(arr);
    
eliminarMenosUno(arr);
    
arr.sort(desorden_aleat); 
    
restaurarMenosUno(arrarr_menosUno);
}

document.write(a1+"<br>"); 
ordenar(a1);
document.write(a1+"<br><br>"); 


document.write(a2+"<br>"); 
ordenar(a2);
document.write(a2); 
Se trata de guardar en un array bidimensional los elementos que queremos omitir. En el indice [0] guardo el indice original, y en el [1] guardo el valor. Luego los elimino del array a ordenar, lo ordeno, y restauro los elementos omitidos en el indice en el que estaban.

Mucho mas engorroso de lo que pensaba que se podría hacer en un principio.

Si teneis alguna sugerencia, plasmarla aqui
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:06.