Foros del Web

Foros del Web (http://www.forosdelweb.com/)
-   Javascript (http://www.forosdelweb.com/f13/)
-   -   Manipular array (http://www.forosdelweb.com/f13/manipular-array-247815/)

furoya 17/11/2004 11:00

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

Gul Dukat 17/11/2004 11:09

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 :pensando:

furoya 17/11/2004 15:30

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

Beakdan 18/11/2004 00:23

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.

furoya 21/11/2004 12:25

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

caricatos 23/11/2004 18:14

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 :arriba:

furoya 26/11/2004 09:00

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

caricatos 26/11/2004 17:33

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... :pensando:
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 :adios:

furoya 27/11/2004 07:42

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

caricatos 27/11/2004 12:36

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 :adios:

furoya 30/11/2004 14:09

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

kepawe 01/12/2004 16:59

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:adios:

caricatos 02/12/2004 07:07

Hola otra vez:

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

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 :pensando:

Saludos :arriba:

kepawe 02/12/2004 21:10

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:adios:

furoya 03/12/2004 10:45

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). :golpeado:

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

kepawe 03/12/2004 12:07

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. :-)

caricatos 05/12/2004 04:58

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... :pensando: ), 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... :pensando: )

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 :arriba:

kepawe 07/12/2004 00:13

Hola de nuevo

Caricatos, me gusta como está quedado la página. :arriba: 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 :adios:

caricatos 08/12/2004 06:00

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 :pensando:
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 :arriba:

furoya 09/12/2004 14:24

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

caricatos 09/12/2004 15:53

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 :pensando:

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

Saludos :arriba:

kepawe 12/12/2004 08:23

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:adios:

furoya 12/12/2004 13:07

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

caricatos 12/12/2004 16:01

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 :adios:

furoya 13/12/2004 11:52

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

kepawe 13/12/2004 20:54

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 :adios:

kepawe 14/12/2004 08:39

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 :adios:

kepawe 14/12/2004 13:23

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 :adios:

kepawe 15/12/2004 15:16

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:adios:

furoya 19/12/2004 14:10

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

kepawe 20/12/2004 18:49

Hola de nuevo.

furoya: Es importante conocer el lenguaje parar poder llevar a cabo una idea, pero sin ideas ese conocimiento es en vano. Digo esto porque la idea que tuviste me parece muy buena y es lo más importante, la forma de llevarla a cabo es secundario, depende de los conocimientos del lenguaje para aprovechar mejor sus recursos, por eso aunque yo tengo unos pocos conocimientos sobre expresiones regulares y poco más de arrays, sin tu idea, el camino que hubiera escogido para desarrollar el método hubiera sido más arduo y complejo en el caso de haberlo conseguido.

En cuanto a que sabes poco o nada de arrays, viendo tu script no es tanta la diferencia entre los dos, creo que con aprender el funcionamiento de expresiones regulares y con lo que esta aprendiendo sobre arrays esta poca diferencia sera nula en poco tiempo.

No se que algoritmo utilizara sort() para ordenar los elementos pero dentro de los algoritmos para ordenar que hay, quicksort es uno de los más rápidos.
Te envío esta dirección para que veas los algoritmos más conocidos para ordenar para que te hagas una idea de como funcionan.

http://www.alumnos.unican.es/%7Euc16069/Javascript.htm

En cuanto a las preguntas que planteas, he estado indagando sobre que codificación de caracteres.
Haz esta prueba, copia el resultado de este script y pegalo en el block de notas, veras que si intentas guardarlo en codificación ANSI , te saldrá un mensaje avisando de que existe caracteres UNICODE.
<html>
<head>
<title></title>
</head>
<body>
<script language="JavaScript" type="text/javascript">
<!--

var s = "String.fromCharCode(32"
for (var Counter = 33; Counter < 400; Counter++) {
s += "," + Counter
}
s += ")"
document.write(eval(s))

//-->
</script>
</body>
</html>

Como sabes la codificación UNICODE permite representar cualquier carácter escrito en en el mundo, y los navegadores están preparados para leer cualquier idioma, si prueba el script en Mozilla y IE veras que algunos caracteres no aparecen en IE, creo que esto depende los paquetes de idiomas que tenga el navegador instalados y la configurado el usuario, creo que es suficiente con la configuración que viene por defecto para los caracteres occidentales.
No se nada de alemán , pero modificando un poco el script anterior, podrías conseguir adaptarlo al aleman.

Por ejemplo si quiseramos ordenar æ después de á bastaría con añadir unas lineas.
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 ñ (mayúsculas)
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)
}
)
// caracteres alemanes
temp_array[ctr] = temp_array[ctr].toString().replace(/æ/g,function (str,offset,s) {
str =str=="æ"?"a|":"a|"
return (str)
}
)

}

El resultado seria para á seria a{ y para æ a|, al ordenar el signo { va antes que | por lo tanto ordinaria primero la a acentuada.

Espero haberme explicado bien, no es mi fuerte. Corrigeme si me equivoco en algo.

Saludos :adios:

furoya 26/12/2004 12:53

:pensando:
El tema de las vocales se me complica un poco; pero no tiene que ver con el código sino con la lógica de los diccionarios, que toman a las vocales acentuadas como vocales simplemente, hasta que aparecen 2 palabras iguales y entonces sí valen los acentos.

Con respecto a las vocales dobles ... el método funciona bien, pero casi las cambiaría por su versión "separada" ( æ por AE) y no admitiría discusiones para otros idiomas.

El algoritmo que usa sort en el ejemplo para ordenar números que posteaste más arriba funciona muy parecido a quickSort; estuve poniendo alertas para seguir el mecanismo. La página que recomiendas me demuestra que esa costumbre no es de mi exclusiva propiedad. La forma en que muestra el desarrollo se termina pareciendo a la de mi código anterior.

Todavía no me animo a corregir 'códigos'; pero seguí investigando sobre ordenamiento alfabético mientras le daba una vuelta de tuerca más al método de cadena reordenada.

Un aparte : es, al menos, interesante que preguntes si hay algo para corregir. No sé si es un tema personal o cultural -aquí se reúne gente de distintas ciudades, formación, edad- pero más de uno considera ofensivo el corregir un mensaje ajeno. A mi me costó entenderlo, porque la idea de un foro es proponer algo publicamente para luego mejorarlo, ampliarlo, re-utilizarlo; y las correcciones, en más de una ocasión, son inevitables. Ésto debe ser más fácil de entender para quien tiene educación científica -se me ocurre-.
También pienso que caricatos ya tiene experiencia en esto de crear códigos en conjunto y es una suerte que se haya interesado en el tema, pero ...
Caricatos : vi que pusiste mi nombre en la página de los Arrays y me dio un poco de vergüenza. Al pricipio creí que era provisorio, ahora sospecho que se va a quedar ahí. Gracias, lo único que vas a conseguir es hacerme famoso.
Volvamos al asunto del alfabeto. Busqué en internet y no hallé listas de caractees ordenados para cada idioma, pero supe que la misma letra puede estar ubicada en distintos sitios dependiendo de qué lengua la utilice.
El segundo paso fue pedir a amigos y conocidos que me dieran los abecedarios que conocían, y me hice solamente del francés, alemán, danés.
Cuando me descubrí caminando hacia la compañía de teléfonos para pedir una guía de cada país del mundo, sospeché que estaba encarando mal el problema.

Si bien un ordenamiento final de letras va a ser, de alguna forma, arbitrario; el ordenamiento de signos y símbolos ( que no suelen estar en diccionarios ni en las páginas amarillas ) puede ser caótico. Elegí un orden, solamente para seguir trabajando, con la certeza de que no será definitivo.

La última versión del método de ordenar por cadenas está en pausa. No me parece que sea páctica y por eso no la posteo. Pero sí la puedo explicar.

Quise ahorrarme uno de los dos strings ( recordemos que del primero obtenía una posición de caracter y el segundo me daba un caracter de reemplazo que serviría para que sort lo ordenase según ASCII ), y decidí aprovechar que cada caracter tiene su número, para convertir todas las palabras a números y luego, sí, pasarlos por sort o quickSort . Pero el ahorro, comparado con la cantidad de código que debo agregar, es mínimo.

Un ejemplo : si quisieramos ordenar AMA, BOJ, CASA, UNA (A=1...Z=26) nos quedaría

Código:

AMA  1131  ó  AMA  011301
UNA  20141      BOJ  021510
BOJ  21510      CASA  03011901
CASA 31191      UNA  201401

La segunda muestra es sin dudas la que funciona. Pero se nota que hay que rellenar con ceros hasta la cantidad de dígitos del 'caracter' más largo. En los ejemplos, todos los caracteres son de '2 dígitos', pero si tenemos en cuenta que en UNICODE hay decenas de miles de caracteres; o llevamos cada letra al máximo posible ( A = 00001 ), con lo que "SALAMANDRA" se convierte en una cadena de 50 caracteres; o buscamos en cada Array el caracter de número más alto y le damos el mismo length a todos los demás caracteres.

Ésto último parece más eficiente, pero requiere más cálculo y más líneas de código aún. Por eso lo abandoné.

Dejo el orden con el que estoy trabajando. Si algún lingúista puede sugerir algún cambio, a mí no me ofende y será bienvenido.

Código:


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

saludos

furoya

caricatos 27/12/2004 17:22

Hola a todos:

furoya: Lo de poner créditos creo que tan solo es lo justo, aunque cuando alguien usa código mio, simplemente me conformo con el agradecimiento. La página, no la toco desde hace tiempo por falta del "ídem" ... Además, mi propia página la tengo un poco descuidada.

El tema me sigue interesando, y en cuando esté más desahogado seguiré adelante.

Sobre el tema de la ordenación, me parece que se están complicando más de lo necesario. Creo que cuando no se trata de palabras normales la ordenación tendría que ser ascii.
Otra cosa que he visto es que se ordena primero unos signos y luego las letras, pero no sería más lógico anteponer tan solo los signos abiertos y dejar los cerrados después de las letras ¿ :pensando: ?
En español los signos cerrados se ponen después de las palabras (incluso en inglés ni se abren).

Saludos y Felicidades :adios:

P.D: furoya, ¿has vuelto a intentar enviar postales?

caricatos 29/12/2004 03:50

Hola otra vez:

A partir de otra pregunta, hemos preparado otros métodos.
La pregunta: http://www.forosdelweb.com/f13/array-257337/

Y las respuestas ya la he puesto en Array.js...
También modifiqué buscar para que devuelva el primer objeto igual y el último:
Los scripts con objetos serían:

Código:

Array.prototype.buscarPrimerObjeto = function(objeto, dato)        {
        var yo = this;
        for (var i = 0, mayor = yo.length; i < mayor; i ++)
                if (yo[i][objeto] == dato) return i;
        return -1;
}

Array.prototype.buscarUltimoObjeto = function(objeto, dato)        {
        var yo = this;
        for (var i = yo.length - 1; i >= 0; i --)
                if (yo[i][objeto] == dato) return i;
        return -1;
}

Creo que pueden ser útiles para acotar arrays dentro de determinados rangos.
Tal vez una buena posibilidad es buscar el primero mayor o igual y el último menor o igual, para evitar el índice -1.

En la página que propuse antes ya implementé una búsqueda: http://www.pepemolina.com/arrays/index.html

Saludos y Felicidades :adios:

furoya 30/12/2004 13:42

Hola todos :

kepawe : estoy a punto de empezar a estudiar mejor tus códigos. Mis métodos me llevan siempre a callejones sin salida, y cuando encuentro un resquicio aparece otra "regla" de ordenación alfabética y tengo que rehacer todo otra vez. Es éso, o abandono hasta después de las vacaciones para poder pensar más claramente.

caricatos : El problema del ASCII es que no es orden alfabético, por eso no sirve. De "casualidad" coinciden las letras en inglés si son todas mayúsculas ( o minúsculas ) por eso para ordenar se usa el truco de toUpperCase(); pero lo de los signos de apertura y cierre es algo atendíble.

saludos y buen año para todos.

furoya

P.D. : ya probé lo de las tarjetas, te mando un MP con los detalles.Gracias.

Neuron_376 01/04/2005 15:35

Acerca de los Arrays ???
 
:pensando:

Una pregunta, he visto que estan batallando mucho con el orden de los arreglos, en este momento yo tengo el mismo problema deseo usar el .sort de javascript, porque esta compromado que es hasta 200 veces mas rapido que cualquier otro script programado por uno mismo, y bien, yo tengo esta idea, y quiero saber si ustedes que ya han visto este tema tantas veces, ya lo habian pensado, y si asi fue, si encontraron muchos problemas y por eso no la implementaron.

1. Crear una funcion que convierte todos los valores en el arreglo a su equivalente a un numero especifico.

function arrArrayChangeValues(arrVar, intType)
{
arrCars = "A, B, C, D, E, F ...... "
arrCarsIntegers = "1,2,3,4,5,6,7,7,9,10......"

if (intType = 1)
{
//Decimos que hemos recibido un arreglo alfanumerico que debemos
//cambiar por sus valores en INTEGER
}
else
{
//Decimos que hemos recibido un arreglo numerico que debemos
//cambiar por sus valores en ALFANUMERICOS
}
}

2. Tenemos nuestro arreglo alfanumerico, entonces, llamamos a la funcion (1), para convertirlo a valores numericos.

arrIntegerValues = arrArrayChangeValues(arrVarOriginal,1)

3. Aplicamos la funcion de JS para el sort numerico.

arrIntegerValues.sort(function(a,b){return a-b;})

4. Tenemos nuestro arreglo numerico correctamente ordenado, entonces, llamamos a la funcion (1), para convertirlo a valores alfanumericos.

arrVarOriginal= arrArrayChangeValues(arrIntegerValues,2)

5. Y listo tenemos el arreglo correctamente ordenados...

Observaciones....

1. Porque estamos seguros que esta correctamente ordenado?
R = Porque nosotros hemos asigando los valores numericos exactos que necesitamos.

2. Este es un algoritmo que cubre todos los casos, logicametne falta solo validar algunos casos y completar el codigo, pero me parece el mejor metodo para hacerlo..

Bueno, entonces por favor si alguien ya lo intento esto, digame que problemas encontro, porque lo veo como lo mas facil de lograr, de hecho los valores numericos pueden ser creados tambien con alguna funcion que se encargue de decir cosas como, "abc" > "y", pensando en unidades, decenas, centenas, etc.

Bien son muchos casos que validar lo se, pero el metodo no lo vi en ninguno de sus comentarios, por eso lo pregunto, y si de algo les sirve, les dejo la idea para que la puedan revisar... por favor cualquier cosa contestenme, mi e-mail es [email protected]

Necesito estar seguro de este metodo porque quiero cambiar mi actual metodo personal de SORT (Burbuja) a usar el SORT de JavaScript, porque bueno, les dejo el dato, esta comprobado que cualquier metodo programado por ti mismo, resulta 200 veces mas lento que el SORT basico que hace jsvascript.

Entonces esa es la verdadera utilidad de todo esto.

Gracias.

Atte.

Neuron_376

furoya 02/04/2005 17:27

Hola Neuron_376 :

la última idea era un orden alfabético. No sé si es lo que buscas, o simplemente ordenar caracteres según una secuencia que tu armas. puedes ver algo así en este mismo tema (p.e. en el mensaje #32). Allí no es necesario hacer un array de números, se usa uno de caracteres reordenados y se lee la ubicación (así se obtiene el número). También se puede usar su código unicode, en cuyo caso en orden será tipo ASCII.

No es necesario poner tu e-mail, te podemos (debemos) responder aquí.

saludos

furoya


La zona horaria es GMT -6. Ahora son las 10:38.

Desarrollado por vBulletin® Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.