Foros del Web » Programando para Internet » Javascript »

Manipular array

Estas en el tema de Manipular array en el foro de Javascript en Foros del Web. Hola todos : no sé si me estoy ahogando en un vaso de agua; pero no puedo agregar y/o quitar elementos de array . Probé ...

  #1 (permalink)  
Antiguo 17/11/2004, 11:00
(Desactivado)
 
Fecha de Ingreso: noviembre-2002
Ubicación: Ciudad Autónoma de Buenos Aires
Mensajes: 2.367
Antigüedad: 22 años, 1 mes
Puntos: 317
Pregunta Manipular array

Hola todos :

no sé si me estoy ahogando en un vaso de agua; pero no puedo agregar y/o quitar elementos de array. Probé con pop() , shift() , etc. ... para modificar los array, pero solamente me reconoce reverse() , sort() y algún otro.

¿No funcionan en IE5? ¿Hay algúna forma de agregar y eliminar un elemento en particular en un lugar específico que funcione en todos los navegadores? -se entiende que descarto las versiones "4", pero el IE5 está instalado aún en muchas máquinas.

gracias

furoya
  #2 (permalink)  
Antiguo 17/11/2004, 11:09
 
Fecha de Ingreso: mayo-2004
Mensajes: 48
Antigüedad: 20 años, 7 meses
Puntos: 0
Hola furoya,

no sé exactamente la dinámica que necesites para agregar o eliminar elementos, pero si quieres dejar vacía alguna posición concreta tal vez podría bastar con que indicaras nombreArray[posicion] = null y para agregar un elemento nuevo pedirle un nombreArray[nombreArray.length] = valor
  #3 (permalink)  
Antiguo 17/11/2004, 15:30
(Desactivado)
 
Fecha de Ingreso: noviembre-2002
Ubicación: Ciudad Autónoma de Buenos Aires
Mensajes: 2.367
Antigüedad: 22 años, 1 mes
Puntos: 317
Hola Gul Dukat:

gracias por responder. Lo que quería era cambiar el orden de los elementos (el primero que vaya al tercero, el séptimo al primero) pero sin alterar el tamaño original. Se me ocurrió experimentar con éstos métodos y empezó a taparme el agua; pensé que me estaba equivocando y al final sospeché que era el navegador quien no los aceptaba.

Por suerte seguí probando y concat(), slice() funcionaron bien. Tengo que dar algunas vueltas, pero de última consigo lo que busco con ellos.

Todavía me queda la duda sobre los navegadores que soportan shift(), unshift (), push(), pop(), .... Pero ya no es urgente. (bueno, nunca lo fue; nadie se va a morir por no saber ésto).

saludos

furoya
  #4 (permalink)  
Antiguo 18/11/2004, 00:23
Avatar de Beakdan  
Fecha de Ingreso: diciembre-2001
Ubicación: Monterrey, Nuevo León
Mensajes: 433
Antigüedad: 23 años
Puntos: 7
Furoya:
Los métodos de array concat, pop, push, shift, slice, splice y unshift fueron implementados en la versión 1.2 de JavaScript. Y Javascript 1.2 es soportado en IE a partir de la versión 5.5.
Hace ya tiempo que no he hecho aplicaciones con JavaScript, pero para que me funcionaran los métodos tenía que identificar las versiones sin soporte para JavaScript 1.2, y entonces usar prototype para emular el funcionamiento:
Código:
function pop(){
 var itemFinal = this[this.length - 1];
 this.length--;
 return itemFinal;
}
 
function push(){
 var itemOffset = this.length
 this.length += arguments.length
 for(i=0; i<arguments.length; i++){
  this[i + itemOffset] = arguments[i];
 }
 return this.length;
}
 
if(version anterior a IE5.5.){
 Array.prototype.pop = pop;
 Array.prototype.push = push;
}
Hasta luego.

Última edición por Beakdan; 18/11/2004 a las 00:33
  #5 (permalink)  
Antiguo 21/11/2004, 12:25
(Desactivado)
 
Fecha de Ingreso: noviembre-2002
Ubicación: Ciudad Autónoma de Buenos Aires
Mensajes: 2.367
Antigüedad: 22 años, 1 mes
Puntos: 317
Hola otra vez :

Ese es un buen dato, Beakdan, gracias. Vi 2 ó 3 sitios sobre el tema y no aclaraban quién soportaba cada método.

Siempre me olvido de los prototype; usando el condicional son una buena opción paa superar estas limitaciones.

Por otro lado, no vi un método que permita cambiar de lugar un elemento de array.
Quiero decir, teniendo

numero = [0,1,2,3,4,5,6,7,8,9];

que exista algo como

numero.move(3,7);

para llevar el elemento de índice 3 a la posición 7 y que nos devuelva

numero = [0,1,2,4,5,6,7,3,8,9];

Se podía crear un prototype o simplemente una función

move(numero,3,7)

, quizás usando slice() y concat().
Voy a probar, por ahora queda como idea.

Tampoco hay uno que "baraje" (mezcle) los elementos. En las FAQs hay algo para desordenar un array, pero me repite la secuencia, por lo que no es tan aleatóreo.

saludos

furoya
  #6 (permalink)  
Antiguo 23/11/2004, 18:14
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años, 8 meses
Puntos: 1284
Hola furoya:

Pensé en ordenar mi galería de fotos y me puse es este tema, y preparé esto:

Código:
Array.prototype.cambiar = function(a, b)	{
	temp = this[a];
	this[a] = this[b];
	this[b] = temp;
	return this;
}

Array.prototype.ordenar = function(elemento)	{
	for (var i = 0, mayorI = this.length - 1; i < mayorI; i ++)
		for (var j = i + 1, mayorJ = this.length; j < mayorJ; j ++)
			if (this[i][elemento] > this[j][elemento])
				this.cambiar(i, j);
	return this;
}
Creo que cambiar es lo que equivale al move de tu ejemplo y ordenar, hace una ordenación de objetos, y el parámetro es el elemento que se ordena.

Puedes ver un ejemplillo aquí: http://www.pepemolina.com/pruebas/ordenarArrays.html

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #7 (permalink)  
Antiguo 26/11/2004, 09:00
(Desactivado)
 
Fecha de Ingreso: noviembre-2002
Ubicación: Ciudad Autónoma de Buenos Aires
Mensajes: 2.367
Antigüedad: 22 años, 1 mes
Puntos: 317
Hola caricatos:

Lo de mover un elemento tiene una vuelta más. En vez de intercambiar posiciones de Array lo que busco es llevar un elemento ( p.e. Array[3] ) a una nueva posición ( p.e. [7]), pero desplazando todos los intermedios 1 lugar ( [0,1,2,4,5,6,7,3,8,...] ). No sé qué utilidad pueda tener -alguien se la va a encontrar-, yo solamente la necesito como eemplo de uso de slice() y concat(), aunque algo así es más fácil de hacer con for().

El ejemplo de la tabla ordenada está muy bueno: es simple y eficiente. No sé si ya estará en las FAQs, pero habría que ponerlo. Allí hay uno también muy bueno, que trabaja con tablas ya hechas, y por lo tanto es -debe serlo- bastante complejo. Pero si uno puede "escribir" la tabla con un escript, el tuyo es mejor. ¿Eso es lo que se llama "array bidimensional"?.

saludos

furoya
  #8 (permalink)  
Antiguo 26/11/2004, 17:33
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años, 8 meses
Puntos: 1284
Hola Furoya:

Había pensado en ponerlo en las FAQs, pero traté de implementar una ordenación con el método quicksort y me encontré con varios errores...
Justamente por esa razón indagué sobre esos métodos que comentas (slice, concat...) y creo que ese move() tendría que ser una concadenación de tres arrays (el del medio de un solo elemento)... y de tratarse de mover los elementos de los extremos solo se concadenarían 2... aunque en tal caso sería más eficiente un pop() y un push() ...

Si me sale el "move()" te pasaré el código.

Saludetes
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #9 (permalink)  
Antiguo 27/11/2004, 07:42
(Desactivado)
 
Fecha de Ingreso: noviembre-2002
Ubicación: Ciudad Autónoma de Buenos Aires
Mensajes: 2.367
Antigüedad: 22 años, 1 mes
Puntos: 317
Hola otra vez :

No estoy seguro de si debes cambiarlo. Uno de los problemas que generó mi pedido de ayuda fue la incompatibilidad de algunos métodos y atributos con navegadores antiguos. Creo que quicksort está en ese grupo.

Lo del "move" lo hice este fin de semana y salió medianamente bien, pero no está de más un nuevo código para comparar. Gracias.

Después de mil pruebas también terminé el de mezclar elementos. No es que estuviera tan dificil, pero no me decidía sobre cuál mecánica era la mejor; y me quedé con la más simple.

Lo tengo en una máquina que perdió la disquetera y no tiene salida a internet. En cuanto pueda recuperar esos códigos los posteo.

saludos

furoya
  #10 (permalink)  
Antiguo 27/11/2004, 12:36
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años, 8 meses
Puntos: 1284
Hola otra vez:

Estuve haciendo nuevos métodos para arrays que puse en este mensaje: http://www.forosdelweb.com/f13/metodos-arrays-250294/

Pero usando esos métodos como pop, slice, shift... Voy a ver si implemento esa funciones y publico todo.

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #11 (permalink)  
Antiguo 30/11/2004, 14:09
(Desactivado)
 
Fecha de Ingreso: noviembre-2002
Ubicación: Ciudad Autónoma de Buenos Aires
Mensajes: 2.367
Antigüedad: 22 años, 1 mes
Puntos: 317
Aquí están los ejemplos que hice.

Código:
<HTML>
<HEAD>
<TITLE>REUBICA ELEMENTO DE ARRAY. </TITLE>
<script language= "JavaScript">
var numero = [0,1,2,3,4,5,6,7,8,9]
var numeroD = [10,11,12,13,14,15,16,17,18,19]
var charly , delta , eco , foxtrot ;
var golf = "ERROR";

function move1(alfa,bravo){
if(alfa<this.length && alfa>=0 && bravo<this.length && bravo>=0 ){
 foxtrot = this.slice(alfa,alfa+1);

 if(alfa < bravo){
 charly = this.slice(0,alfa);
 delta = this.slice(alfa+1,bravo+1);
 eco = this.slice(bravo+1,this.length);
 golf = charly.concat(delta.concat(foxtrot.concat(eco)));
 }

 else if(alfa > bravo){
 charly = this.slice(0,bravo);
 delta = this.slice(bravo,alfa);
 eco = this.slice(alfa+1,this.length);
 golf = charly.concat(foxtrot.concat(delta.concat(eco)));
 }
 else golf = this;
}
return golf;
}

var kilo , lima , mike , noviembre;

function move2(hotel , indio , julieta){
kilo = hotel.length;
lima = new Array(kilo);
lima = []
mike = 0;

for(noviembre=0;noviembre<kilo;noviembre++){
if((indio<julieta && noviembre == indio) || (indio>julieta && noviembre == indio*1+1)){
mike++; lima[noviembre]=hotel[mike]; mike++;};
else if(noviembre == julieta){lima[noviembre]=hotel[indio]; }
else if(indio == julieta){lima=hotel; }
else {lima[noviembre]=hotel[mike]; mike++;}

//alert(" kilo="+kilo+"\n lima="+lima+"\n mike="+mike+"\n noviembre="+noviembre+"\n hotel="+hotel+"\n indio="+indio+"\n julieta="+julieta+"\n")

}
return lima;
}

Array.prototype.move1 = move1;
</script>
<style>
</style>
</HEAD>
<BODY>
<h2>Mover un elemento del <tt>array</tt> a otra posición.</h2>

<tt>
var numero = [0,1,2,3,4,5,6,7,8,9]<br>
var numeroD = [10,11,12,13,14,15,16,17,18,19]
<p>
<b>NOMBRE_ARRAY</b>.move1(<b>ELEMENTO_A_MOVER</b> , <b>POSICIÓN_DONDE_MOVER</b>)
</tt></p>
<p align=right><tt>prototype</tt> con <tt>concat() , slice()</tt> <input type=button value="numero.move1(3 , 7)" onclick=alert(numero.move1(3,7))> 
<input type=button value="numeroD.move1(8 , 2)" onclick=alert(numeroD.move1(8,2))>
</p>
<hr width=50% align=right>
<p>
<tt>move2(<b>NOMBRE_ARRAY</b> , <b>ELEMENTO_A_MOVER</b> , <b>POSICIÓN_DONDE_MOVER</b>)
</tt></p>
<p align=right><tt>for()</tt> <input type=button value="move2(numero , 3 , 7)" onclick=alert(move2(numero,3,7))> 
<input type=button value="move2(numeroD , 8 , 2)" onclick=alert(move2(numeroD,8,2))>
</p>

Estas funciones devuelven un nuevo <tt>Array</tt> sin modificar el original. 
</BODY>
</HTML>
Código:
<html>
<head>
<title> BARAJA ARRAY.</title>
<script>
var oscar = ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"];
var papa, quebec, romeo, sierra, tango;

Array.prototype.shuffle = function(){
romeo = this;
papa = romeo.length;
for (sierra=0; sierra<papa; sierra++){
quebec = romeo[sierra];
tango = Math.floor(Math.random()*papa);
romeo[sierra] = romeo[tango];
romeo[tango] = quebec;
}
return romeo;
}

</script>


<script>
var numeros , largo;

function creaArray(){
largo = frm2.elem.value;
numeros = new Array(largo);

for(a=0;a<largo;a++){
numeros[a] = a;
}
frm2.arr.value = numeros;
}

function shuffle2(romeo){
papa = romeo.length;
for (sierra=0; sierra<papa; sierra++){
quebec = romeo[sierra];
tango = Math.floor(Math.random()*papa);
romeo[sierra] = romeo[tango];
romeo[tango] = quebec;
}
frm2.verArray2.value=romeo;
}
</script>

<style>
#verArray{width:100%; font-weight:bold}
</style>

</head>
<body>
<h2>Mezcla elementos de <tt>Array</tt> en forma aleatórea.</h2>

<form name="frm1">
<input id="verArray" name="verArray" type="button" 
value="Enero,Febrero,Marzo,Abril,Mayo,Junio,Julio,Agosto,Septiembre,Octubre,Noviembre,Diciembre" 
title="Desordenar" onclick="this.value=oscar.shuffle()">
</form>
<p>Con click en el botón los meses se desordenan.<br>
Usa <tt>prototype</tt>.

<hr>

<h2>Crea un <tt>Array</tt> numérico y lo desordena.</h2>
<table align=center><td align=center>
<form name=frm2>
<input type=button value="Crear Array" onclick="creaArray()"> de 
<input size=3 name=elem value="100"> elementos.
<p>
<textarea name="arr" id="arr" cols=25 rows=5></textarea> 
</td><td align=center>
<input value="Desordenar Array" type="button" title="Desordenar" onclick="if(numeros)shuffle2(numeros)">
<p>
<textarea name="verArray2" id="verArray2" cols=25 rows=5></textarea>
</td></table>
</form>
</body>
</html>
saludos

furoya
  #12 (permalink)  
Antiguo 01/12/2004, 16:59
 
Fecha de Ingreso: agosto-2004
Mensajes: 157
Antigüedad: 20 años, 4 meses
Puntos: 5
Hola a todos.

Furoya, te envío otra forma de crear el método "move" , para que lo compares y poder ver los posibles errores que se me puedan haber escapado.




Código PHP:
<html>
<
head>
<
title>Metódo array move_to</title>
<
script language=JavaScript type=text/javascript>
<!--


Array.
prototype.move_to = function(a,b){
// a - elemento a mover
// b - es la posición
  
>= this.length this.length 0a
  b 
>= this.length this.length 0b
 
  
var element_move this[a]
  if(
b){
    for(var 
ctr actr bctr++){
          
this[ctr] = this[ctr+1]
     }
  }
  if(
b){
     for(var 
ctr actr bctr--){
           
this[ctr] = this[ctr-1]
     }
  }
  
this[b] = element_move
 
}

//-->
</script>

</head>
<body>
<script language=JavaScript type=text/javascript>
<!--
var n = 2
var my_array = new Array("cero","primero","segundo","tercero","cuarto","quinto","sexto","septimo","octavo")
// El primer argumento el elemento a mover y el segundo la posición
// donde queremos situarlo
my_array.move_to(8,n)

var msg = ""
for (var ctr=0; ctr < my_array.length; ctr++){
  if(ctr == n){
    msg+=my_array[ctr].bold()+" "
  }
  else{
   msg+=my_array[ctr]+" "
  }
}
document.write(msg)
//-->
</script>
</body>
</html> 
Saludos
  #13 (permalink)  
Antiguo 02/12/2004, 07:07
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años, 8 meses
Puntos: 1284
Hola otra vez:

Que bien que empezamos a tener una buena colección de métodos para los arrays

Yo he descubierto algún fallo en la implementación, pero ya va funcionando.
Puse una página aquí: http://www.pepemolina.com/arrays/index.html en donde probaré las novedades.

Acomodaré también los script que se vayan añadiendo a estos mensajes y los iré actualizando en el enlace.

furoya: Parece que la idea de tu script de mover muy parecida a la mia de encadenar los subArrays... pero yo pensé en rotar() los elementos

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #14 (permalink)  
Antiguo 02/12/2004, 21:10
 
Fecha de Ingreso: agosto-2004
Mensajes: 157
Antigüedad: 20 años, 4 meses
Puntos: 5
Hola de nuevo a todos.

He cambiado la metódo "move" para que también pueda rotar los elemento a la derecha o izquierda, también otro método para ordenar aleatoriamente los elementos.
He añadido unas funciones que encuentro de gran utilidad para el método sort() que por defecto ordena alfabeticamente los elementos, he puesto comentarios en el código para explicar para que vale cada una.



Código PHP:

<html>
<
head>
<
title>Manipulaci&oacute;n de elementos de un array.</title>
<
script language=JavaScript type=text/javascript>
<!--

/*Sintaxis
nombre_array.move_to("right") - rota  los elementos a la derecha una posición
nombre_array.move_to("left") - rota  elementos a la izquierda una posición
nombre_array.move_to(1,5) - el primer argumento elemento a mover y el segundo
                              la posición.
por ejemplo move_to(1,5) [0,1,2,3,4,5,6] daria este resultado [0,2,3,4,5,1,6]

*/
Array.prototype.move_to = function(){
  
// rota los elementos a la derecha
  
if(arguments[0] == "right"){
    
this.length 1
    b 
0
  
}
  
// rota los elementos a la izquierda
  
else if(arguments[0] == "left"){
    
0
    b 
this.length 1
  
}
  
// mueve un elemento a una posición
  
else{
    
arguments[0]
    
arguments[1]
  }
  
>= this.length this.length 0a
  b 
>= this.length this.length 0b

  
var element_move this[a]
  if(
b){
    for(var 
ctr actr bctr++){
          
this[ctr] = this[ctr+1]
     }
  }
  if(
b){
     for(var 
ctr actr bctr--){
           
this[ctr] = this[ctr-1]
     }
  }
  
this[b] = element_move


}
/* mueve los elementos aleatorimente.
  la Sintaxis - nombre_del_array.random_array() */

Array.prototype.random_array = function(){
var 
ctr 0
while(ctr this.length){
    var 
Math.floor(this.lengthMath.random())
    var 
Math.floor(this.lengthMath.random())
    
this.move_to(a,b)
    
ctr++
  }

}
//  FUNCIONES PARA EL MÉTODO SORT()

// Esta función ordena los números de menor a mayor
/* Solo es valida para array donde todos sus valores
son numericos */
//Sintaxis - nombre_array.sort(numeric_sort_min)
function numeric_sort_min(element1element2){
  return (
element1 element2)

}

// Esta función ordena los números de mayor a menor
/* Solo es valida para array donde todos sus valores
son numericos */
//Sintaxis - nombre_array.sort(numeric_sort_max)
function numeric_sort_max(element1element2){
  return (
element2 element1)

}
// Ordena alfábeticamente pero en sentido inverso
//Sintaxis - nombre_array.sort(reverse_alpha_sort)
function reverse_alpha_sort(element1,element2){
  if(
element1 element2){
    return -
1
  
}
  else if(
element1 element2){
    return 
1
  
}
  else{
    return 
0
  
}

}
//
//-->
</script>



</head>

<body>
<center><div id="numeros"></div></center><br>
<script language=JavaScript type=text/javascript>
<!--


var my_array1 = new Array(0,1,2,3,4,5,6,7,8,9)



function show_array1(){
var msg1=""

    for (var ctr=0; ctr < my_array1.length; ctr++){
        if((my_array1[ctr] === 0) && (ctr != my_array1.length - 1)){msg1+=my_array1[ctr]+ ",".fontcolor("red")}
        else if(ctr == my_array1.length - 1){msg1+=my_array1[ctr]}
        else{msg1+=my_array1[ctr]+ ","}

    }
    document.getElementById("numeros").innerHTML = "my_array1= new Array(".bold().fontsize(6) +
                                                  msg1.bold().fontsize(6) +
                                                  ")".bold().fontsize(6)

}
show_array1()
//-->
</script>


  <form name="form1" onsubmit="return false"><center>
  <input type="button"  value="Rotar a la izquierda" onmouseup="my_array1.move_to('left');show_array1();">
  <input type="button"  value="Ordenar aleatoriamente" onmouseup="my_array1.random_array();show_array1();">
  <input type="button"  value="Rotar a la derecha" onmouseup="my_array1.move_to('right');show_array1();">
  <br>
  <input type="button"  value="Ordenar de mayor a menor" onclick="my_array1.sort(numeric_sort_max);show_array1();">
  <input type="button"  value="Ordenar de menor a mayor" onclick="my_array1.sort(numeric_sort_min);show_array1();"><br>
  Mover el elemento
  <input type="text"  name="el" value="0" size="5" onblur="if(isNaN(parseInt(this.value))){this.value='0'}">
  a la posición
  <input type="text" name="pos" value="5" size="5" onblur="if(isNaN(parseInt(this.value))){this.value='5'}">
  <input type="button"  value="Mover" onmouseup="my_array1.move_to(parseInt(this.form.el.value),parseInt(this.form.pos.value));show_array1();">
  </center>
</form>
</body>
</html> 
Saludos
  #15 (permalink)  
Antiguo 03/12/2004, 10:45
(Desactivado)
 
Fecha de Ingreso: noviembre-2002
Ubicación: Ciudad Autónoma de Buenos Aires
Mensajes: 2.367
Antigüedad: 22 años, 1 mes
Puntos: 317
Hola, (que interesante se está poniendo este tema) :

caricatos : sí, me parece que varios están quedando parecidos; pero las pequeñas variaciones de mecanica o formato terminan sirviendo para que quien esté tratando de aprender pueda comparar como se llega a un mismo resultado por diferentes caminos. Por otro lado, ya expliqué que si algo me sale bien, seguro que es porque se lo había visto antes a alguien ...

kepawe : no tuve tiempo de probar el último; pero sí estuve jugando con los anteriores. Lindo lo de bold(). Al principio no me funcionaba porque yo cambiaba la n en my_array.move_to(8,n).

El otro también anda. Voy a estudiar eso del condicional; parece complicado, pero algo como

a = a >= this.length ? this.length - 1 : a < 0 ? 0: a
b = b >= this.length ? this.length - 1 : b < 0 ? 0: b


se ve más prolijo que

if((indio<julieta && noviembre == indio) || (indio>julieta && noviembre == indio*1+1))

gracias a todos

furoya
  #16 (permalink)  
Antiguo 03/12/2004, 12:07
 
Fecha de Ingreso: agosto-2004
Mensajes: 157
Antigüedad: 20 años, 4 meses
Puntos: 5
Hola furoya

Lo del condicional no es tan complicado, el truco es añadir es otra condicional
en el resultado negativo, asi podrias añadir todas las comparaciones que veas necesaria.

expresion_comparacion ? verdad:expresion_ comparacion ? verdad: expresion_comparativa? verdad : mentira



a = a >= this.length ? this.length - 1 : a < 0 ? 0: a
b = b >= this.length ? this.length - 1 : b < 0 ? 0: b

En esta expresion solo compruebo que los argumento no sean mayor que la longitud del array - 1 o inferior a 0

a = es mayor o igual que la longitud del array ? si es verdad ( this.length -1) : es mentira
comprabamos que el valor no sea menor de cero ? es verdad (0): es mentira mantenemos el valor original de (a)

Como ves parece más de lo que es.
  #17 (permalink)  
Antiguo 05/12/2004, 04:58
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años, 8 meses
Puntos: 1284
Hola otra vez:

Estoy actualizando la página que antes mencioné (cambiando la estética, y añadiendo los métodos que se ven en este mensaje ... y el otro... ), y el resulado se puede ver aquí: http://www.pepemolina.com/arrays/index.html

Los métodos están en un .js aparte: http://www.pepemolina.com/arrays/Arrays.js
Pero los nuevos métodos move1 y move_to no funcionan bien, supongo que será porque los parámetros que paso son cadenas y no números (move_to('left') y 'right' funcionan bien porque son cadenas... )

Bueno, tal vez sea mejor chequear los parámetros de las funciones, yo lo hice con mi "mover" y no da ningún error.

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #18 (permalink)  
Antiguo 07/12/2004, 00:13
 
Fecha de Ingreso: agosto-2004
Mensajes: 157
Antigüedad: 20 años, 4 meses
Puntos: 5
Hola de nuevo

Caricatos, me gusta como está quedado la página. He estado mirando como solucionar el problema y la forma más sencilla que en contrado es modificando un poco las funciones en Arrays.js .

Código PHP:
function move1(alfa,bravo)    {
  
alfa parseInt(alfa)
  
bravo parseInt(bravo)
  if(
isNaN(alfa)||isNaN(bravo)){
    return (
"Debe de rellenar los campos params ")
    }
  
    if(
alfa<this.length && alfa>=&& bravo<this.length && bravo>=)    { 
Código PHP:

 
else{ 
    
parseInt(arguments[0])
    
parseInt(arguments[1])
    if(
isNaN(a)||isNaN(b)){ 
      return  ( 
"Debe de rellenar los campos params ")
    }
    
  } 
  
>= this.length this.length 0
  b 
>= this.length this.length 0
Saludos
  #19 (permalink)  
Antiguo 08/12/2004, 06:00
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años, 8 meses
Puntos: 1284
Hola otra vez:

kepawe: Gracias por los retorques... ya arregle los scripts y la página, en donde añadí algunas cosas más: shuttle de furoya y tu random_array, que por cierto tuve que añadirle al final "return this" para que pudiera funcionar... no sé si crees que está bien
También puse unos enlaces a esta página, nuestros perfiles...
Y empecé a desarrollar otras pestañas sobre arrays asociativos y colecciones.

Me gustaría que me dieran su opinión.

Por ahora puse cosas que "devuelven arrays", no ´se que hacer con los métodos que devuelven otras cosas y a la vez modifican el array como pop, push, shift...
Creo que pondré campos dentro de las descripciones mostrando el array original modificado...

Bueno, si hay alguna sugerencia, las espero.

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #20 (permalink)  
Antiguo 09/12/2004, 14:24
(Desactivado)
 
Fecha de Ingreso: noviembre-2002
Ubicación: Ciudad Autónoma de Buenos Aires
Mensajes: 2.367
Antigüedad: 22 años, 1 mes
Puntos: 317
Cita:
Iniciado por kepawe en el mensaje # 16
...Lo del condicional no es tan complicado, ... Como ves parece más de lo que es ...
Sí. Como en todos los casos, para entender algo lo primero es no asustarse y luego comenzar a estudiarlo. Gracias kepawe.

caricatos : tu página de métodos está quedando cada vez mejor. Me sorprendió que no funcionaran bien los move, y después entendí que era un tema del formulario.
Pero esta objeción junto con tu ejemplo de ordenación de tabla, me dieron un par de ideas.

Para empezar, sort ordena por caracteres; es decir : que los valores numéricos van a ser interpretados como cadenas, y así un "27" va a quedar antes que un "8". Lo que no está mal si queremos simular un orden alfabético, pero no vi un método que ordene valores numéricos de menor a mayor o viceversa.

Por ahora sólo tengo como encontrar el valor mínimo o máximo de una lista de números, y también los elementos más corto y más largo de un Array

Código:
<HTML>
<HEAD>
<script language= "JavaScript">
var numeros = [0,1,2,3,4,5,6,7,8,9];
var letras = ["A","BB","CCC","DDDD","EEEEE","F"];

Array.prototype.minNumber = function(){
var ini = this[0];
var ary = this;
var str = ary.join("");
var checkNum = str*1;
//var ind;
if(checkNum == str){
 for(i=1 ; i<this.length ; i++){
  if(this[i]<ini) {
  ini=this[i]; /* DEVUELVE EL VALOR DEL ELEMENTO MÁS BAJO */
  //ind=i; /* DEVUELVE LA POSICIÓN DEL ELEMENTO MÁS BAJO */
  }
 }
}
else alert("Al menos un elemento de Array no es numérico.");
return ini;
}


Array.prototype.lengthMinMax = function(){
var minVal = maxVal = this[0];
var minOrgn = maxOrgn = this[0].length;
 for(i=1 ; i<this.length ; i++){
  if(this[i].length < minOrgn) {minVal = this[i];}
  if(this[i].length > maxOrgn) {maxVal = this[i];}
  }
var nuevo = [minVal,maxVal];
return nuevo
}


</script>
<style>
input{width:40%}
</style>
</HEAD>
<BODY>
<input type=button value="1,5,9,0,3,7,6,2,4,8" onclick="this.value = numeros.minNumber()"> Muestra el valor mínimo de un Array numérico.
<p>
<input type=button value='A,BB,CCC,DDDD,EEEEE,F' onclick="this.value = letras.lengthMinMax()"> Muestra los valores más corto y más largo de un Array de cadenas.<br>
Si existen 2 elementos con la misma cantidad de caracteres muestra el de índice más bajo.
</BODY>
</HTML>
Para explicar la "segunda idea" voy a corregir algo que escribí más arriba : sort no ordena alfabeticamente sino por ASCII ( o ANSI). Es decir, que nuestra "Ñ" y las vocales acentuadas van a terminar en cualquier lado. Habría que crear también un spanishSort(), pero ésto va a ser enormemente más complicado que ordenar números de menor a mayor ...

saludos

furoya
  #21 (permalink)  
Antiguo 09/12/2004, 15:53
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años, 8 meses
Puntos: 1284
Hola furoya:

Me alegro de que te guste como va, y agracezco los aportes... aunque este alojada en mi dominio, ya sabes que es de todos.

Ahora no voy a estudiar tu código porque ya es algo tardillo, pero te voy a comentar un sistema que implementé hace unos años en Pascal (cuando se usaba Turbo Pascal) para una ordenación alfabética. Se trata de hacer una cadena ordenada con el alfabeto: "AaÁáBbCc... MmNnÑñOoÓó... Zz"... Luego recorrer la cadena hasta encontrar el primer carácter diferente y comparar la posición del elemento en el alfabeto que hemos creado... Ahora no estoy seguro si debe usarse charAt o indexOf

Bueno, si tengo tiempo mañana, trataré de hacer un ejemplillo.

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

Caricatos: no es necesario añadir "return this" al método random, ya que solo modicamos el orden del mismo array. Por ejemplo si quisieramos hacer una copia de un array con los elementos rotados a la izquierda, y eliminar el ultimo elemento del array original si es necesario utilizar return para enviar la copia, pero no seria necesario para el array original.
Te envio este ejemplo.

Código PHP:

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


Array.
prototype.rotarI = function() {

var 
temp = new Array(this.length)
   
   if(
temp.length 0){
   
     var 
first_element this[0]
        
     for(var 
ctr 0ctr this.length 1ctr++){
          
temp[ctr] = this[ctr+1]
     }
       
     
temp[temp.length 1] = first_element
   
}
   
// eliminamos el ultimo elemento del array
   
this.length--
   
// enviamos el array a la variable
   
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> 
Cita:
Iniciado por furoya
Sí. Como en todos los casos, para entender algo lo primero es no asustarse y luego comenzar a estudiarlo. Gracias kepawe.
De nada furoya, estoy totalmente de acuerdo contigo.
En cuanto a lo de ordenar los numeros puedes utilizar la funciones para el metodo sort() que puse en un anterior mensaje, tengo una vaga idea de como funciona ya que estas funciones no son mias. Las vuelvo a enviar.

Código PHP:

//  FUNCIONES PARA EL MÉTODO SORT()

// Esta función ordena los números de menor a mayor
/* Solo es valida para array donde todos sus valores
son numericos */
//Sintaxis - nombre_array.sort(numeric_sort_min)
function numeric_sort_min(element1element2){
  return (
element1 element2)

}

// Esta función ordena los números de mayor a menor
/* Solo es valida para array donde todos sus valores
son numericos */
//Sintaxis - nombre_array.sort(numeric_sort_max)
function numeric_sort_max(element1element2){
  return (
element2 element1)

}
// Ordena alfábeticamente pero en sentido inverso
//Sintaxis - nombre_array.sort(reverse_alpha_numerical)
function reverse_alpha_numerical(element1,element2){
  if(
element1 element2){
    return -
1
  
}
  else if(
element1 element2){
    return 
1
  
}
  else{
    return 
0
  
}


Como dices habria que crea un spanishSort(), he pensado como se puede hace y creo que la mejor forma de hacerlo es como lo plantea Caricatos. Si consigo hacerla la enviare.

Saludos
  #23 (permalink)  
Antiguo 12/12/2004, 13:07
(Desactivado)
 
Fecha de Ingreso: noviembre-2002
Ubicación: Ciudad Autónoma de Buenos Aires
Mensajes: 2.367
Antigüedad: 22 años, 1 mes
Puntos: 317
Soy un papelón.

donde puse "... no vi un método que ordene valores numéricos ..." debí escribir "... no miré ...".

Es cierto que sort ordena como string (cadena); pero en varias de las páginas que busqué cuando no pude echar a andar algunos métodos, explicaban que agregando funciones a sort se podía ordenar números en forma ascendente y descendente.
Lo que no mostraban era qué funciones. Me alegra que también las hayas agregado a este tema.

Ahora que leo lo de "...una cadena ordenada con el alfabeto ..." recuerdo que una vez hice un encriptador de páginas web con una especie de ROT13 (que no era '13') y usé dos cadenas : una ordenada según ASCII, y la otra desplazada varios caracteres. Se me ocurre que el mismo sistema para "encriptar" se puede usar para reescribir cada elemento según nuestro alfabeto y luego ordenarlo con sort ; para después volver cada palabra a su forma original.

Para ser más claro : la palabra "maña" se convierte en "maoa", se ordena, y luego se vuelve a "maña"; "año" quedaría como "aop", porque el agregado de la "ñ" desplaza todo el resto del alfabeto un lugar.

Es una lástima que no encuentre ese código. Estoy casi seguro de que quedó en la máquina de mi "Ex". Si no me formateó el disco, voy a buscar alguna excusa para recuperarlo.

(Pensar que lo abandoné porque me dió verguenza estar trabajando en algo con lo que estoy en total desacuerdo -digo, lo de encriptar HTML, JS,...-. Pero en esta vida hasta lo que no nos gusta termina sirviendo, tarde o temprano.)

saludos

furoya
  #24 (permalink)  
Antiguo 12/12/2004, 16:01
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años, 8 meses
Puntos: 1284
Hola a todos:

La verdad es que estoy un poco abrumado con estos últimos mensajes, y me ha sorprendido gratamente los aportes de kepawe... (a furoya ya lo conocía y nunca tuve dudas sobre el nivel de sus aportaciones)

Lo de devolver el array o una copia modificada también lo entiendo, pero no llego a comprender los criterios que hay que considerar para dejar el mismo array o devolver una copia. Creo que cuando consiga entenderlo mejor, me explayaré en la página sobre este tema, porque creo que es un tema muy interesante.

Muchas gracias por enseñarme cosas nuevas.

Saludetes
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #25 (permalink)  
Antiguo 13/12/2004, 11:52
(Desactivado)
 
Fecha de Ingreso: noviembre-2002
Ubicación: Ciudad Autónoma de Buenos Aires
Mensajes: 2.367
Antigüedad: 22 años, 1 mes
Puntos: 317
Hola caricatos :

coincido plenamente con lo de los aportes de kepawe, y me alegra mucho que se haya sumado al tema. Con respecto al comenterio sobre el otro forero ... creo que habla mejor de tí, que eres muy generoso ( el muy caradura en su vida tocó un Array y se mete como si supiera !).

Bien, pero voy aprendiendo. Y les agradezco la paciencia.

Empecé algo para el spanishSort(); pero no sé si es para MSIE o para cualquier navegador, por eso paré. Lo posteo a continuación. Como es una prueba, solamente usa minúsculas sin acento; y aún falta ordenar los segundos valores y una vez ordenados mostrar los primeros en el mismo orden.

Código:
 

<HTML>
<head>
<script>

cadenas = new Array();
cadenas[0] = ["ama"],[];
cadenas[1] = ["maña"],[];
cadenas[2] = ["año"],[];
cadenas[3] = ["cruz"],[];

ascii = "abcdefghijklmnopqrstuvwxyzñ";
espan = "abcdefghijklmnñopqrstuvwxyz";
letra = "";
letras = "";

function muestra(ary){
alert("Array original : "+ary+"\nCantidad de elementos : "+ary.length);
 for(j=0;j<ary.length;j++){
 tex = cadenas[j][0];
 tex = tex.toString();
 largo = tex.length;
 alert("Elemento "+j+" :"+tex+"\nCantidad de caracteres : "+largo);
  for(i=0;i<largo;i++){
  letra = tex.charAt(i);
  enEspan = espan.indexOf(letra);
  enAscii = ascii.charAt(enEspan);
  letras += enAscii;
  alert("Caracter "+i+" : "+letra+"\nNueva cadena : "+letras);
  }
 cadenas[j][1] = letras;
 letras = "";
 }
 alert("Cadena final : \n"+cadenas.toString());
}

</script>
</head>
<body>


<input type=button value="Crea elementos 'ASCIIados'" onclick="muestra(cadenas)">
<input type=button value="Muestra la cadena completa" onclick="alert(cadenas.toString())">

</body>
</HTML>
Si no hay ningún código propietario, pienso seguir. Y si hay alguna mejora o corrección es bienvenida.

saludos

furoya
  #26 (permalink)  
Antiguo 13/12/2004, 20:54
 
Fecha de Ingreso: agosto-2004
Mensajes: 157
Antigüedad: 20 años, 4 meses
Puntos: 5
Hola de nuevo

Cita:
Iniciado por Caricatos
Muchas gracias por enseñarme cosas nuevas.
De nada, Caricatos. Yo también estoy aprendiendo gracias a vosotros.

He utilizado la idea de encriptar de furoya, pero utilizando expresiones regulares.

Cita:
Iniciado por furoya
la palabra "maña" se convierte en "maoa", se ordena, y luego se vuelve a "maña"; "año" quedaría como "aop", porque el agregado de la "ñ" desplaza todo el resto del alfabeto un lugar.
He probado el script, parece que funciona pero puede que se me haya escapado algo.

<html>
<head>
<title>spanish_sort( )</title>
<script language=JavaScript type=text/javascript>
<!--

Array.prototype.spanish_sort = function(){
//Creamos este array para copiar los elementos del array
var temp_array = new Array()
// Poblamos el array temp_array con los elementos de array queremos ordenar
for(var ctr = 0; ctr < this.length ; ctr++){
temp_array[ctr] = this[ctr]
// Sustituimos las vocales acentuadas y la ñ (mininusculas)
temp_array[ctr] = temp_array[ctr].toString().replace(/á|é|í|ó|ú|ñ/g,function (str,offset,s) {
str =str=="á"?"ab":str=="é"?"ef":str=="í"?"ij":str=="ó "?"op":str=="ú"?"uv":str=="op"?"":"op"
return (str)
}
)
//Sustituimos las vocales acentuadas y la ñ (mayusculas)
temp_array[ctr] = temp_array[ctr].toString().replace(/Á|É|Í|Ó|Ú|Ñ/g,function (str,offset,s) {
str =str=="Á"?"AB":str=="É"?"EF":str=="Í"?"IJ":str=="Ó "?"OP":str=="Ú"?"UV":str=="OP"?"":"OP"
return (str)
}
)
}
// ordenamos alfabeticamente
var sc = true
var lg = temp_array.length
while(sc &&(--lg > 0)){
sc= false
for(var i =1; i<= lg; i++){
if(temp_array[i-1] > temp_array[i]){
tmp = temp_array[i -1]
tmpo = this[i-1]
temp_array[i-1] = temp_array[i]
this[i-1] = this[i]
temp_array[i] = tmp
this[i] = tmpo
sc= true
}

}

}

}



//-->
</script>

</head>
<body>
<script language=JavaScript type=text/javascript>
<!--
var myarray = new Array("Zapato","NIÑA","1&1",1,333,"AL","niño","NIÑ O","áó","áo","zapato","ñu","ÑU","niña","a","No a la guerra!!","Ñ","ñ","nana","caSa","exposicion","No a la GUERRA!!","tú","té","tílde","toldo","exposición"," A")
var show = ""
var show1 =""
var show2 =""

for(var ctr = 0; ctr < myarray.length; ctr++){

show += myarray[ctr] + "<br>"

}


myarray.sort()

for(var ctr = 0; ctr < myarray.length; ctr++){

show1 += myarray[ctr] + "<br>"

}

myarray.spanish_sort()
for(var ctr = 0; ctr < myarray.length; ctr++){

show2 += myarray[ctr] + "<br>"

}
//-->
</script>

<table border="1">
<tr>
<td><b>ARRAY ORIGINAL</b></td>
<td><b>MÉTODO sort( )</b></td>
<td><b>MÉTODO spanish_sort( )</b></td>

</tr>
<tr>
<td><script>document.write(show)</script></td>
<td><script>document.write(show1)</script></td>
<td><script>document.write(show2)</script></td>
</tr>
</table>
</body>
</html>

Furoya, no entiendo bien lo de "Con respecto al comenterio sobre el otro forero....", pero creo que sepamos mucho o poco de un tema, todos aportamos algo.

Saludos
  #27 (permalink)  
Antiguo 14/12/2004, 08:39
 
Fecha de Ingreso: agosto-2004
Mensajes: 157
Antigüedad: 20 años, 4 meses
Puntos: 5
Hola furoya y caricatos.

El código del método "spanish_sort" tiene un error. Posiciona la "o" antes que la "ñ", mando el script corregido.

<script language=JavaScript type=text/javascript>
<!--

Array.prototype.spanish_sort = function(){
//Creamos este array para copiar los elementos del array
var temp_array = new Array()
// Poblamos el array temp_array con los elementos de array queremos ordenar
for(var ctr = 0; ctr < this.length ; ctr++){
temp_array[ctr] = this[ctr]
// Sustituimos las vocales acentuadas y la ñ (mininusculas)
temp_array[ctr] = temp_array[ctr].toString().replace(/á|é|í|ó|ú|ñ/g,function (str,offset,s) {
str =str=="á"?"ab":str=="é"?"ef":str=="í"?"ij":str=="ó "?"op":str=="ú"?"uv":str=="ñ"?"n~":"n~"
return (str)
}
)
//Sustituimos las vocales acentuadas y la ñ (mayusculas)
temp_array[ctr] = temp_array[ctr].toString().replace(/Á|É|Í|Ó|Ú|Ñ/g,function (str,offset,s) {
str =str=="Á"?"AB":str=="É"?"EF":str=="Í"?"IJ":str=="Ó "?"OP":str=="Ú"?"UV":str=="Ñ"?"N~":"N~"
return (str)
}
)
}
// ordenamos alfabeticamente
var sc = true
var lg = temp_array.length
while(sc &&(--lg > 0)){
sc= false
for(var i =1; i<= lg; i++){
if(temp_array[i-1] > temp_array[i]){
tmp = temp_array[i -1]
tmpo = this[i-1]
temp_array[i-1] = temp_array[i]
this[i-1] = this[i]
temp_array[i] = tmp
this[i] = tmpo
sc= true
}

}

}

}



//-->
</script>

Saludos
  #28 (permalink)  
Antiguo 14/12/2004, 13:23
 
Fecha de Ingreso: agosto-2004
Mensajes: 157
Antigüedad: 20 años, 4 meses
Puntos: 5
Hola de nuevo

Después después de corregir el error de la "ñ", he caido en la cuenta
que lo mismo le sucede a las vocales acentuadas,vuelvo ha enviar
el script corregiendo estos errores. Creo que ahora va bien.

<html>
<head>
<title>spanish_sort( )</title>
<script language=JavaScript type=text/javascript>
<!--

Array.prototype.spanish_sort = function(){
//Creamos este array para copiar los elementos del array
var temp_array = new Array()
// Poblamos el array temp_array con los elementos de array queremos ordenar
for(var ctr = 0; ctr < this.length ; ctr++){
temp_array[ctr] = this[ctr]
// Sustituimos las vocales acentuadas y la ñ (mininusculas)
temp_array[ctr] = temp_array[ctr].toString().replace(/á|é|í|ó|ú|ñ/g,function (str,offset,s) {
str =str=="á"?"a{":str=="é"?"e{":str=="í"?"i{":str=="ó "?"o{":str=="ú"?"u{":str=="ñ"?"n{":"n{"
return (str)
}
)
//Sustituimos las vocales acentuadas y la ñ (mayusculas)
temp_array[ctr] = temp_array[ctr].toString().replace(/Á|É|Í|Ó|Ú|Ñ/g,function (str,offset,s) {
str =str=="Á"?"A{":str=="É"?"E{":str=="Í"?"I{":str=="Ó "?"O{":str=="Ú"?"U{":str=="Ñ"?"N{":"N{"
return (str)
}
)
}
// ordenamos alfabeticamente
var sc = true
var lg = temp_array.length
while(sc &&(--lg > 0)){
sc= false
for(var i =1; i<= lg; i++){
if(temp_array[i-1] > temp_array[i]){
tmp = temp_array[i -1]
tmpo = this[i-1]
temp_array[i-1] = temp_array[i]
this[i-1] = this[i]
temp_array[i] = tmp
this[i] = tmpo
sc= true
}

}

}

}



//-->
</script>

</head>
<body>
<script language=JavaScript type=text/javascript>
<!--
var myarray = new Array("Zapato","NIÑA","1&1",1,333,"AL","tu","niño" ,"v","u","ú","NIÑO","áó","áo","zapato","opera","ó" ,"ñu","ÑU","niña","a","No a la guerra!!","Ñ","ñ","nana","caSa","exposicion","o"," ó","No a la GUERRA!!","tú","té","tílde","toldo","exposición"," A")
var show = ""
var show1 =""
var show2 =""

for(var ctr = 0; ctr < myarray.length; ctr++){

show += myarray[ctr] + "<br>"

}


myarray.sort()

for(var ctr = 0; ctr < myarray.length; ctr++){

show1 += myarray[ctr] + "<br>"

}

myarray.spanish_sort()
for(var ctr = 0; ctr < myarray.length; ctr++){

show2 += myarray[ctr] + "<br>"

}
//-->
</script>

<table border="1">
<tr>
<td><b>ARRAY ORIGINAL</b></td>
<td><b>MÉTODO sort( )</b></td>
<td><b>MÉTODO spanish_sort( )</b></td>

</tr>
<tr>
<td><script>document.write(show)</script></td>
<td><script>document.write(show1)</script></td>
<td><script>document.write(show2)</script></td>
</tr>
</table>
</body>
</html>

Saludos
  #29 (permalink)  
Antiguo 15/12/2004, 15:16
 
Fecha de Ingreso: agosto-2004
Mensajes: 157
Antigüedad: 20 años, 4 meses
Puntos: 5
Hola de nuevo
He añadido el método quicksort para mejorar el script.

<script language="JavaScript" type="text/javascript">
<!--
function comparate(m,dc){
if(m == dc) return 0
else if(m < dc) return -1
else if(m >dc) return 1
}

function quicksort( m, mo, inf, sup){
var izq,der,mitad,x,y
var izq = inf
var der = sup
var mitad = m[Math.floor((izq + der) / 2)]
do{
while (comparate(m[izq],mitad)< 0 && izq < sup) izq++
while (comparate(mitad,m[der])< 0 && der > inf) der--
if (izq <= der){
x = m[izq]; y = mo[izq]
m[izq] = m[der];mo[izq] = mo[der]
m[der] = x;mo[der] = y
izq++; der--
}
}

while (izq <= der){
if (inf < der) quicksort(m,mo, inf, der)
if (izq < sup) quicksort(m,mo, izq, sup)}
}


Array.prototype.spanish_sort = function(){
//Creamos este array para poblarlo con los elementos del array original
var temp_array = new Array()
// Poblamos el array temp_array con los elementos de array queremos ordenar
for(var ctr = 0; ctr < this.length ; ctr++){
temp_array[ctr] = this[ctr]
// Sustituimos las vocales acentuadas y la ñ (mininusculas)
temp_array[ctr] = temp_array[ctr].toString().replace(/á|é|í|ó|ú|ñ/g,function (str,offset,s) {
str =str=="á"?"a{":str=="é"?"e{":str=="í"?"i{":str=="ó "?"o{":str=="ú"?"u{":str=="ñ"?"n{":"n{"
return (str)
}
)
//Sustituimos las vocales acentuadas y la ñ (mayusculas)
temp_array[ctr] = temp_array[ctr].toString().replace(/Á|É|Í|Ó|Ú|Ñ/g,function (str,offset,s) {
str =str=="Á"?"A{":str=="É"?"E{":str=="Í"?"I{":str=="Ó "?"O{":str=="Ú"?"U{":str=="Ñ"?"N{":"N{"
return (str)
}
)
}
// ordenamos

quicksort(temp_array,this,0, this.length -1)


}



//-->
</script>


He pensado que seria util un método para extraer un subconjuntos de elementos según las letras o
números, si modificar el array original.Por ejemplo en un array númerico:

var numeros = [1,2,20,4,200,6]
var numero1 = numeros.extraer(4,21)

Extraeria los numeros entre 4 y 21.

Con las letras sería algo parecido.

var letras = ["coche","avión","león"]
var letras1 = letras.extraer("a")
var letras2 = letras.estraer("a","d")
La variable letras1 extraria todos los elementos que empiecen por "a" o "á"
La variable letras2 extraria todos los elementos comprendidos entre "a" y "d".

Si lo consiguo lo envio.

Saludos
  #30 (permalink)  
Antiguo 19/12/2004, 14:10
(Desactivado)
 
Fecha de Ingreso: noviembre-2002
Ubicación: Ciudad Autónoma de Buenos Aires
Mensajes: 2.367
Antigüedad: 22 años, 1 mes
Puntos: 317
Hola todos :

kepawe : En realidad es complicado, pero de a poco se va resolviendo.

Me pareció gracioso -no sé por qué- notar que te encontrabas con los mismos problemas que yo al avanzar con el desarrollo. En un punto empecé a sospechar que el orden alfabético en español va a ser superado por un orden alfabético 'universal'. Pero no nos adelantemos y vamos desde un principio.

Para empezar, me encapriché con usar sort(), cuando debe haber formas de ordenar más eficientes, que no usen el código ANSI que es cualquier cosa menos alfabético. No encontré material sobre quikSort(), pero debe tener la misma secuencia.

Por otro lado, no usé expresiones regulares a pesar de revelarse como la manera más práctica de reemplazar caracteres; porque me bajé un tutorial hace 1 mes y medio y todavía no tuve tiempo de estudiarlo.

Ésto último me recuerda que debo una aclaración. Es evidente que todos podemos aprender aún de las ideas más absurdas; pero también queda muy claro que sé poco y nada de Arrays. Por eso dije que caricatos fue muy generoso al dar por sentado que mis aportaciones debían estar al nivel del tema, y que mi osadía no tiene límites si pretendo que lo estén.

Aún así, dejo este código :

Código:
<HTML>
<head>
<script>

cadenas = new Array();

cadenas[0] = ["ama"];
cadenas[1] = ["maña"];
cadenas[2] = ["Año"];
cadenas[3] = ["cruz"];
cadenas[4] = ["ñandú"];
cadenas[5] = ["oca"];
cadenas[6] = ["nardo"];
cadenas[7] = ["este"];
cadenas[8] = ["éste"];
cadenas[9] = ["×ØÞß"];
cadenas[10] = ["1234"];

ascii = "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_";
ascii += "`abcdefghijklmnopqrstuvwxyz{|}~";
ascii += "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ";
ascii += "*¡¢£¤¥¦§¨©ª«¬*®¯°±²³´µ¶·¸¹º»¼½¾¿";
ascii += "ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞß";
ascii += "àáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ";

espan = "@AÀÁÂÃÄÅÆBCÇDÐEÈÉÊËFGHIÌÍÎÏJKLMNÑ";
espan += "OÒÓÔÕÖŒPQRSŠTUÙÚÛÜVWXYÝŸZ[\\]^_`";
espan += "AÀÁÂÃÄÅÆBCÇDÐEÈÉÊËFGHIÌÍÎÏJKLMNÑ";
espan += "OÒÓÔÕÖŒPQRSŠTUÙÚÛÜVWXYÝŸZ{|}~€";
espan += "‚ƒ„…†‡ˆ‰‹Ž‘’“”•–—˜™›ž*¡¢£¤¥¦";
espan += "§¨©ª«¬*®¯°±²³´µ¶·¸¹º»¼½¾¿×ØÞß÷øþ";

var letra = "";
var letras = "";
var muestra = "";
var tempArray = new Array();

function toAscii(ary){
izq = document.getElementById("alfa");
muestra = "Array original : "+ary+"\nCantidad de elementos : "+ary.length;
izq.value += muestra; alert(muestra);
 for(j=0;j<ary.length;j++){
 tex = ary[j];
 tex = tex.toString();
 largo = tex.length;
muestra = "\nElemento "+j+" :"+tex+"\nCantidad de caracteres : "+largo;
 izq.value += muestra; alert(muestra);
  for(i=0;i<largo;i++){
  letra = tex.charAt(i);
  cod = letra.charCodeAt();
   if((cod>63) && (cod<256)){
   letra = letra.toUpperCase();
   enEspan = espan.indexOf(letra);
   enAscii = ascii.charAt(enEspan);
   letras += enAscii;
   }
  else letras += letra;
muestra ="\nCaracter "+i+" : "+letra+"\nNueva cadena : "+letras;
  izq.value += muestra; alert(muestra);
  }
 tempArray[j] = letras+"\t"+j;
 letras = "";
 }
muestra ="\n\nCadena final : \n"+tempArray.toString();
 izq.value += muestra; alert(muestra);
}

function toSpanish(ary){
der = document.getElementById("bravo");
muestra = "Array original : "+ary+"\nCantidad de elementos : "+ary.length+"\n";
der.value += muestra; alert(muestra);
 for(j=0;j<ary.length;j++){
 tex = ary[j];
 tex = tex.toString();
 ind = tex.substring(tex.lastIndexOf("\t")+1);
 tex = tex.substring(0,tex.lastIndexOf("\t"));
 largo = tex.length;

muestra = " \n Elemento "+j+" :"+tex+"\nCantidad de caracteres : "+largo+" Index original : "+ind;

 der.value += muestra; alert(muestra);
  for(i=0;i<largo;i++){
  letra = tex.charAt(i);
  enAscii = ascii.indexOf(letra);
  enEspan = espan.charAt(enAscii);
  letras += enEspan;
muestra = "\r\nCaracter "+i+" : "+letra+"\r\nNueva cadena : "+letras;
  der.value += muestra; alert(muestra);
  }
 ary[j] = cadenas[ind];
 letras = "";
 }
muestra = "\r\nCadena final : \r\n"+ary.toString();
 der.value += muestra; alert(muestra);
}

function limpiar(){
document.getElementById("alfa").value="";
document.getElementById("bravo").value="";

}

</script>
<style>
textarea{width:100%; height:100%}

</style>
</head>
<body>

<table width=100% height=100%>
<tr height=10><td align=center>
<input type=button value="Crea elementos 'ASCIIados'" onclick="toAscii(cadenas)"> <br>
<input type=button value="Muestra el Array ordenado" onclick="alert(tempArray.sort())"> <br>
<input type=button value="Crea elementos 'Español'" onclick="toSpanish(tempArray)"> 
</td><td align=center>
<input type=button value="Limpia desarrollos" onclick="limpiar()"> <br>
<input type=button value="Muestra el Array original" onclick="alert(cadenas.toString())"> <br>
<input type=button value="Muestra el Array final" onclick="alert(tempArray.toString())"> 
</td></tr>
<tr><td width=50%><textarea id=alfa></textarea></td><td width=50%><textarea id=bravo></textarea></td></tr></table>
</body>
</HTML>
Me dió bastante trabajo lograr un demo que funcionara. Traté de no mirar mucho los ejemplos anteriores para no tentarme en seguir alguna de esa líneas y así lograr otra forma de obtener el spanishSort(). Pero a medida que avanzaba noté que
  1. Cualquier ordenamiento debe seguir -justamente- un orden alfabético y no un orden arbitrario o cómodo solamente para las máquinas.

  2. Ese ordenamiento no tiene que ser "en español". En realidad, se puede crear una cadena que contenga -al menos- todos los caracteres latinos u occidentales (los cirílicos los dejamos para más adelante).

El problema que se aparece ahora, es más lexicológico que técnico. Hay que ubicar en su sitio caracteres como eth ("Ð") o la doble s alemana ("ß"), que serán salteados si no se usan, pero que deben estar por si son necesarios. Un tema aparte son las vocales dobles ("æ" , "Œ"), ya que para la ordenación final deben ser reemplazadas por 2 caracteres ("ae" y "OE" respectivamente); y es allí donde se van a necesitar seguro las regular expressions.

Supongo que con ésto ya tenemos bastante por hoy.

saludos

furoya
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 11:06.