Foros del Web » Programando para Internet » Javascript »

Dos tipos de ordenamiento de un array en dos variables

Estas en el tema de Dos tipos de ordenamiento de un array en dos variables en el foro de Javascript en Foros del Web. Hola. Tengo un array inicial n al que le quiero aplicar dos criterios de ordenación diferentes: de menor a mayor y el inverso, de mayor ...
  #1 (permalink)  
Antiguo 26/07/2007, 08:48
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 21 años, 1 mes
Puntos: 45
Dos tipos de ordenamiento de un array en dos variables

Hola.

Tengo un array inicial n al que le quiero aplicar dos criterios de ordenación diferentes: de menor a mayor y el inverso, de mayor a menor.

Con .sort() tengo el primero, y con .sort().reverse() tengo el segundo, así de fácil.


Pero si intento guardar "copias" de esa ordenación en variables, me funciona de forma anómala:
Código PHP:
// Creo
var 4583;

// n a un array de Strings
n.toString().split("");

// Lo ordeno de menor a mayor y lo guardo en n0
var n0 n.sort();
// Le doy la vuelta (porque n ya está ordenado) y lo guardo en n1
var n1 n.reverse();

document.write(n0 +"<br/>");            // espero 3,4,5,8
document.write(n1 +"<br/>");            // espero 8,5,4,3
// en los dos casos sale 8,5,4,3 
Lo que ocurre es que me salen resultados inesperados, es como si las asignaciones no sirvieran para nada:
Código PHP:
var n0 n.sort();
var 
n1 n.reverse(); 
es lo mismo que
Código PHP:
var n0 n1 n.sort().reverse(); 

¿Cómo se entiende eso? ¿Tengo que hacer una copia del array "manualmente" para tratarlo?

Siempre me ha pasado lo mismo
Código PHP:
//creo
var = (4583).toString().split("");
//copio
var copiaN n;
//ordeno la copia
copiaN.sort();
//escribo el original, que se supone que no lo he tocado
document.write(n);
// Resultado esperado: 3,4,5,8; Resultado obtenido: 3,4,5,8; 
¿Qué pasa, que se copia por referencia y no por valor? Modifico cualquier cosa de copiaN y se modifica n.



¿Cómo lo resolvéis, con la copia "manual" con un bucle por cada elemento?
__________________
- 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 26/07/2007, 09:00
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 21 años, 1 mes
Puntos: 45
Re: Dos tipos de ordenamiento de un array en dos variables

Bueno, he leído la manera más elegante de hacer esto en el comentario #16 de esta entrada:

Cita:
Iniciado por #16
var a = [ 1, 2 ];
var b = [].concat(a);

Lamentablemente solo nos sirve para arrays unidimensionales :(
... ni siquiera para objetos ...


¿Alguna solución / experiencia?
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #3 (permalink)  
Antiguo 26/07/2007, 09:12
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 20 años, 5 meses
Puntos: 834
Re: Dos tipos de ordenamiento de un array en dos variables

Yo lo haría así:
Código PHP:
<script>
var 
4583;

// n a un array de Strings
n.toString().split(""); 
Array.
prototype.sortNumAsc = function() {
   return 
this.sort( function (a,b) { return a-b; } );
}
Array.
prototype.sortNumDesc = function() {
   return 
this.sort( function (a,b) { return b-a; } );
}

alert(n.sortNumAsc())
alert(n.sortNumDesc())
</script> 
  #4 (permalink)  
Antiguo 03/08/2007, 07:44
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 21 años, 1 mes
Puntos: 45
Re: Dos tipos de ordenamiento de un array en dos variables

Bueno, sí. Ahora he llegado un poquito más allá.

Además que he leído esto:
Cita:
Iniciado por Jonathan Snook
the ECMAScript specification [PDF] actually makes somewhat of a separation between primitive types and objects:

A primitive value is a member of one of the following built-in types: Undefined, Null, Boolean, Number, and String; an object is a member of the remaining built-in type Object; and a method is a function associated with an object via a property.
Lo he leído en esta página:
JavaScript: Passing by Value or by Reference

Que además nos explica cosas curiosas, por ejemplo que si pasamos un método de una instancia por argumento a una función ejecutadora (una función que se encargue de ejecutar funciones ) entonces pasan estas cosas:

Código PHP:
function myobject(){
    
this.value 5;
}
myobject.prototype.add = function(){
    
this.value++;
}
var 
= new myobject();
alert(o.value); // o.value = 5
o.add();
alert(o.value); // o.value = 6
function objectchanger(fnc){
    
fnc(); // runs the function being passed in
}
objectchanger(o.add);
alert(o.value); // sorry, still just 6 
En fin, creo que voy a ser incapaz de entenderlo, dicen que es porque this now refers to the context of the object making the call instead of the object’s function we just passed in.

Cuando me ocurra seguro que estoy tres horas dándole vueltas... jeje.


Saludos.
__________________
- 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 18:39.