Foros del Web » Programando para Internet » Javascript »

Métodos de Arrays

Estas en el tema de Métodos de Arrays en el foro de Javascript en Foros del Web. Hola: Estuve haciendo nuevos métodos para los arrays: Me gustaría que me dijeran si funcionan bien: Rotar a la izquierda: Código: Array.prototype.rotarI = function() { ...
  #1 (permalink)  
Antiguo 27/11/2004, 04:03
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.561
Antigüedad: 16 años, 3 meses
Puntos: 1266
Métodos de Arrays

Hola:

Estuve haciendo nuevos métodos para los arrays:

Me gustaría que me dijeran si funcionan bien:

Rotar a la izquierda:

Código:
Array.prototype.rotarI = function()	{
	var yo = this;
	var primero = yo.shift();
	yo[yo.length] = primero;
	return yo;
}
Rotar a la derecha:

Código:
Array.prototype.rotarD = function()	{
	var yo = this;
	var primero = new Array(yo.pop());
	return primero.concat(yo);
}
Cambiar 2 elementos: (esto es también útil para ordenación... el siguiente)

Código:
Array.prototype.cambiar = function(a, b)	{
	var yo = this;
	var temp = yo[a];
	yo[a] = yo[b];
	yo[b] = temp;
	return yo;
}
Ordenar por un campo (array de objetos)

Código:
Array.prototype.ordenar = function(esto)	{
	var yo = this;
	for (var i = 0, mayor = yo.length - 1; i < mayor; i ++)
		for (var j = i + 1; j < yo.length; j ++)
			if (yo[i][esto] < yo[j][esto])
				yo.cambiar(i, j);
	return yo;
}
Espero poder hacer la ordenación por el método quicksort más adelante.

Mover primer elemento a un luger determinado (rotando el resto):

Código:
Array.prototype.moverPrimeroA = function(b)	{
	var yo = this;
	if (b == yo.length - 1)	
		return yo.rotar();
	else	{
		if (b < (yo.length - 1))	{
			principio = yo.slice(0, b + 1).rotarI();
			fin = yo.slice(b + 1, yo.length);
			return principio.concat(fin);
		}
		else
			return yo;
	}
}
Mover un elemento al final del array:

Código:
Array.prototype.moverAlFinal = function(b)	{
	var yo = this;
	if (b == 0)	
		return yo.rotar();
	else	{
		if (b < (yo.length - 1))	{
			principio = yo.slice(0, b);
			fin = yo.slice(b, yo.length).rotarI();
			return principio.concat(fin);
		}
		else
			return yo;
	}
}
Mover un elemento a otra parte (usa los 2 métodos anteriores):

Código:
Array.prototype.mover = function(a, b)	{
	var yo = this;
	if (a < 0 || b < 0)
		return yo;
	if (a == 0)
		return yo.moverPrimeroA(b);
	if (b == (yo.length - 1))
		return yo.moverAlFinal(a);
	if (a > 0 && b < yo.length)	{
		principio = yo.slice(0, a);
		mitad = yo.slice(a, b + 1).rotarI();
		fin = yo.slice(b + 1, yo.length)
		return principio.concat(mitad, fin);
	}
}
Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #2 (permalink)  
Antiguo 27/11/2004, 16:21
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.561
Antigüedad: 16 años, 3 meses
Puntos: 1266
Hola otra vez:

En alguna implementación he usado métodos de los arrays, pero parece que en versiones viejas de los exploradores no valen, entonces preparé nuevas versiones que se corresponden con pop(), shift(), slice() y concat():
//pop()
Código:
Array.prototype.desapilarUltimo = function()	{
	devolver = this[this.length - 1];
	this.length--;
	return devolver;
}
//shift()
Código:
Array.prototype.desapilarPrimero = function()	{
	devolver = this[0];
	for (var i = 0, mayor = this.length - 1; i < mayor; i ++)
		this[i] = this[i + 1];
	this.length--;
	return devolver;
}
//slice()
Código:
Array.prototype.subArray = function(primero, ultimo)	{
	devolver = new Array(ultimo - primero);
	for (var i = 0, mayor = ultimo - primero; i <= mayor; i ++)
		devolver[i] = this[i + primero];
	devolver.length = ultimo - primero;
	return devolver;
}
//concat()
Código:
Array.prototype.encadenar = function()	{
	for (var i = 0, mayor = arguments.length; i < mayor; i ++)
		for (j = 0, mayorEnArray = arguments[i].length; j < mayorEnArray; j ++)
			this[this.length] = arguments[i][j];
	return this;
}
Entonces por cada aparición de pop() abría que poner desapilarUltimo()... shift() por desapilarPrimero()... slice() por subArray() y concat() por encadenar().

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #3 (permalink)  
Antiguo 29/11/2004, 08:57
(Desactivado)
 
Fecha de Ingreso: noviembre-2002
Ubicación: Ciudad Autónoma de Buenos Aires
Mensajes: 2.367
Antigüedad: 15 años, 8 meses
Puntos: 317
Hola Caricatos :

Estuve probando los prototype en un IE5.00.2614.3500, y curiosamente todos los métodos funcionan, así que por ahora no soy de mucha ayuda.

Algunos tienen su bug, y hay que pulirlos un poco. Por ejemplo, rotarD duplica el Array -vacío- al comienzo; ordenar me confundió un poco ¿qué exactamente debo poner en 'esto'?; moverPrimeroA(9) me tira error, en otros valores, no; lo mismo ocurre con moverAlFinal(0); mover se trula cuando el primer valor es mayor que el segundo (ésto puede originar las fallas anteriores).

En el tema previo Manipular Array Beakdan había puesto algunos prototype. No estaría mal juntar todo en las FAQs cuando se pueda confirmar qué funciona en cuál.

Te sigo debiendo los que hice yo. Ya pude sacar los pedazos de disquete que había en la máquina, pero la disquetera aún no funciona (y eso que esta vez no me sobraron piezas!). Si no la puedo arreglar hoy habrá que llamar a alguien que sepa ...

saludos

furoya
  #4 (permalink)  
Antiguo 29/11/2004, 16:32
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.561
Antigüedad: 16 años, 3 meses
Puntos: 1266
Hola furoya:

Gracias por probar el código. Tomo nota de los bugs y procuraré arreglarlos. Admito que no los he chequeado a fondo, pero al ver en un ejemplo que cumplían su cometido los dí por válidos... Tampoco hice pruebas en otros navegadores (salvo lo de ordenar)

ordenar() tiene un parámatro porque se trata de una ordenación de objetos con distintos campos. Por ejemplo, la primera prueba la hice con mi galería: http://www.pepemolina.com/galeria/index.html
En el último de los ejemplos (es un iframe) se muestran unos botones para ordenar las miniaturas, y se puede ordenar por los distintos campos de los objetos (URL, fecha, comentario)

Creo que algunas cosas son de fácil corrección.

A medida de que vea que funcionan correctamente, iré publicando los resultados.

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #5 (permalink)  
Antiguo 30/11/2004, 13:12
(Desactivado)
 
Fecha de Ingreso: noviembre-2002
Ubicación: Ciudad Autónoma de Buenos Aires
Mensajes: 2.367
Antigüedad: 15 años, 8 meses
Puntos: 317
Bien. Probé lo mismo en otra máquina con la misma versión de IE. El único que funciona es mover.

Es evidente que el problema no es el navegador sino algún parche o actualización que falta. Pero no pienso ponerme a buscarlo.

Ahora recuerdo que lo mismo me había pasado con algunos VisualScripts, pero como usaban ActiveX sabía positivamente que en esa máquina no estaba la última -ni la penúltima, ni la antepenúltima ...- versión; así que no me preocupé porque no funcionaran.

Una cosa es tener un navegador viejo; pero otra es no poner todos los parches. No sé si tiene aún tanta prioridad un prototype de compatibilidad, aunque sigue siendo un buen ejercicio para que no se oxiden las neuronas.

saludos

furoya
  #6 (permalink)  
Antiguo 30/11/2004, 14:54
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.561
Antigüedad: 16 años, 3 meses
Puntos: 1266
Hola otra vez:

Ya encontré algunos errores...
Primero había definido rotar y después rotarD y rotarI (a la derecha y a la izquierda), pero en moverAlFinal y moverPrimeroA se usaba rotar cuando debía ser rotarI.

También estaba mal definido rotarD porque se crea un array con el contenido de pop() y el valor se convierte en el tamaño del array, y si se trata de un número va muy mal.

Cuando controe otras cosas, haré todos los arreglos y prepararé una página en condiciones...

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #7 (permalink)  
Antiguo 01/12/2004, 08:45
 
Fecha de Ingreso: agosto-2004
Mensajes: 157
Antigüedad: 13 años, 10 meses
Puntos: 5
Hola caricatos y furoya.

Te envío el método rotarD.

Código PHP:

Array.prototype.rotarD = function() {
   if(
this.length 0){
     var 
last_element this[this.length-1]
     for(var 
ctr this.length -1ctr 0ctr--){
           
this[ctr] = this[ctr-1]
     }
     
this[0] = last_element
   
}

Espero que te sirva.
Saludos
  #8 (permalink)  
Antiguo 03/12/2004, 09:52
(Desactivado)
 
Fecha de Ingreso: noviembre-2002
Ubicación: Ciudad Autónoma de Buenos Aires
Mensajes: 2.367
Antigüedad: 15 años, 8 meses
Puntos: 317
Hola kepawe :

Muy ingenioso. Agregué un par de líneas porque me gusta ver como funciona el for() y quería que me devolviera el valor del array. Creo que va a ser más claro para los que estemos tratando de aprender, y después el alerta se borra.

Código:
 

<script>
var num=[0,1,2,3,4,5,6,7,8,9];
Array.prototype.rotarD = function() { 
   if(this.length > 0){ 
     var last_element = this[this.length-1] 
     for(var ctr = this.length -1; ctr > 0; ctr--){ 
           this[ctr] = this[ctr-1] 
     alert(this);
     } 
     this[0] = last_element;
     return this 
   } 
} 


</script>

<input type=button value="qwerty" onclick="this.value=num.rotarD()">
Con algo parecido se puede hacer rotarI. En el tema que mencioné más arriba (con link) puse también algunos ejemplos "listos para usar".

saludos

furoya
  #9 (permalink)  
Antiguo 06/12/2004, 22:52
 
Fecha de Ingreso: agosto-2004
Mensajes: 157
Antigüedad: 13 años, 10 meses
Puntos: 5
Hola furoya:
Disculpa por la tardanza en contestar pero no me ha sido posible contestar antes.
Me incluyo en los que tratamos de aprender.

He estado mirando los métodos que has creado y me parece muy buena idea lo de crea un nuevo array manteniendo igual el original. He estado probando como hacerlo de distinta forma, probando y probando....... me ha salido esto.



Código PHP:

<html>
<
head>
<
title>Copia de un array rotando sus elementos  a la izquierda</title>
</
head>
<
script language=JavaScript type=text/javascript>
<!--

// Rota los elementos del array a la izquierda
Array.prototype.rotarI = function() {
// creamos el array temp y lo poblamos con el array numero
var temp = eval("new Array("+this+")")
   
// comprobamos que tiene elementos el array
   
if(temp.length 0){
     
// Guardamos  el primer elemento
     
var first_element temp[0]
        
// movemos todos los elementos a la izquierda menos el ultimo
        // el resultado final seria [1,2,3,4,5,5]
     
for(var ctr 0ctr temp.length 1ctr++){
          
temp[ctr] = temp[ctr+1]
     }
        
// Cambiamos el valor del ultimo elemento
     
temp[temp.length 1] = first_element
   
}
   
// devolvemos el array
   
return (temp)
}
var 
numeros = new Array(0,1,2,3,4,5)
var 
copia numeros.rotarI()
var 
copia2 numeros.rotarI()
var 
msg=" "
for(var ct 0ct copia.lengthct++){
    
    
msg+= copia[ct]+ " "
}
alert("Array numeros: " numeros "\n" "Array copia:" copia +
       
"\n Array copia2: " copia2)
alert(msg)
//-->
</script>

<body>

</body>
</html> 
Un saludo
  #10 (permalink)  
Antiguo 08/12/2004, 08:10
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.561
Antigüedad: 16 años, 3 meses
Puntos: 1266
Hola otra vez:

Como algunos métodos no estaban bien implementados, los he estado corrigiendo:

Código:
Array.prototype.rotarD = function()	{
	var yo = this;
	var primero = new Array();
	primero[0] = yo.pop(); //igual a yo.desapilarUltimo()
	primero = primero.concat(yo);
	return primero;
}
Código:
Array.prototype.moverPrimeroA = function(b)	{
	var yo = new Array();
	yo = this;
	var longitudArray = yo.length;
	
	if (b == yo.length - 1)	
		return yo.rotarI();
	else	{
		if (b < (longitudArray) && b > 0)	{
			principio = new Array();
			principio = yo.slice(0, parseInt(b) + 1);
			principio.length = parseInt(b) + 1;
			fin = new Array();
			fin = this.slice(parseInt(b) + 1, longitudArray);
			principio = principio.rotarI().concat(fin);
			return principio;
		}
		else
			return yo;
	}
}
Código:
Array.prototype.moverAlFinal = function(b)	{
	var yo = this;
	var longitudArray = yo.length;
	if (b == 0)	
		return yo.rotarI();
	else	{
		if (b < (yo.length - 1))	{
			principio = yo.slice(0, b);
			fin = yo.slice(b, longitudArray).rotarI();
			yo = principio.concat(fin);
			return principio.concat(fin);
		}
		else
			return yo;
	}
}
Estos 2 métodos sirven de ayuda a mover...

Código:
Array.prototype.mover = function(a, b)	{
	var rotar = "rotarI";
	var yo = this;
	var longitudArray = yo.length;
	if (a < 0 || b < 0)
		return yo;
	if (a == 0)
		return yo.moverPrimeroA(b);
	if (b == (yo.length - 1))
		return yo.moverAlFinal(a);
	if (a > b)	{temp = a; a = b; b = temp; rotar = "rotarD";}
	if (a > 0 && b < longitudArray)	{
		principio = yo.slice(0, parseInt(a));
		mitad = yo.slice(parseInt(a), parseInt(b) + 1)[rotar]();
		fin = yo.slice(parseInt(b) + 1, longitudArray);
		return principio.concat(mitad, fin);
	}
	return yo;
}
En esta página se pueden probar: http://www.pepemolina.com/arrays/index.html

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
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 00:56.