domingo, 6 de agosto de 2017

Javascript Parte LVI

Cuando llamamos a una función JavaScript crea automáticamente un objeto llamado "arguments" que almacena los valores que le pasamos a dicha función. También este objeto arguments almacena en una propiedad llamada length la cantidad de parámetros que llegaron. Veamos un ejemplo muy sencillo.
Confeccionar una función que retorne la suma de dos enteros:
<html>
<head>
</head>
<body>

<script type="text/javascript">

  function sumar(x,y)
  {
    var s=x+y;
    return s;
  }

  document.write(sumar(5,3));

</script>

</body>
</html>
Luego podemos resolver esta misma función accediendo al objeto arguments que se crea cada vez que llamamos a una función:
<html>
<head>
</head>
<body>

<script type="text/javascript">

  function sumar(x,y)
  {
    var s=arguments[0]+arguments[1];
    return s;
  }

  document.write(sumar(5,3));

</script>

</body>
</html>

Como podemos observar dentro de la función sumar accedemos al primer parámetro mediante el objeto arguments (con el subíndice 0 accedemos al primer parámetro llamado x) Tenemos dos formas de acceder al primer parámetro de la función : con el nombre x o con arguments[0].
Como podemos observar si debemos sumar dos valores que llegan como parámetro el algoritmo más claro es el primero en lugar que tener que acceder al objeto "arguments", pero veremos que en muchas situaciones el objeto "arguments" nos favorece en la implementación de funciones mucho más complejas y reutilizables.
Problema
Confeccionar una función que reciba un conjunto variable de enteros y nos retorne su suma:
<html>
<head>
</head>
<body>

<script type="text/javascript">

  function sumar()
  {
    var s=0;
    var f;
    for(f=0; f<arguments.length; f++)
    {
      s=s+arguments[f];
    }
    return s;
  }

  document.write(sumar(2,4));
  document.write('<br>');
  document.write(sumar(1,2,3,4,5));
  document.write('<br>');
  document.write(sumar(100,200,300));

</script>

</body>
</html>
Como no sabemos con cuantos parámetros llamaremos a la función sumar no indicamos ningún parámetro. Luego la única forma de acceder a los parámetros es mediante el objeto "arguments" y por medio del subíndice accedemos uno a uno. También el objeto "arguments" tiene una propiedad length que almacena la cantidad de parámetros recibidos por la función.
Esta sintaxis nos permite codificar funciones muy poderosas que se adaptan a muchas situaciones, como vemos luego podemos llamar a la función sumar pasando 2 parámetros:
  document.write(sumar(2,4));
5 parámetros:
  document.write(sumar(1,2,3,4,5));
3 parámetros:
  document.write(sumar(100,200,300));
etc.
Problema
Confeccionar una función que reciba un conjunto de string y genere dentro de la página una lista ordenada (<ol>). La función debe recibir en el primer parámetro el id de un div.
<html>
<head>
</head>

<script type="text/javascript">

  window.onload=iniciar;

  function iniciar()
  {
    generarLista('lista1','uno','dos','tres','cuatro','cinco','seis');
  }

  function generarLista()
  {
    var s='<ol>';
    var f;
    for(f=1;f<arguments.length;f++)
    {
      s=s+'<li>'+arguments[f]+'</li>';
    }
    s=s+'</ol>';
    var elemento1=document.getElementById(arguments[0]);
    elemento1.innerHTML=s;
  }

</script>


<body>
<div id="lista1"></div>
</body>
</html>
Veamos por partes el funcionamiento de este programa. En el body de la página hemos definido un div con id llamado "lista1" sin contenido:
<body>
<div id="lista1"></div>
</body>
En el bloque del script inicializamos la propiedad onload del objeto window indicando la función a ejecutar luego que la página esta completamente cargada:
  window.onload=iniciar;
Es decir que la función iniciar se ejecuta una vez que la página está completamente construida (es decir ya está en memoria el div definido en el body)
La función iniciar es la que llama a la función generarLista pasando como parámetros primero el id del div a cargar y a partir del segundo parámetro en adelante los distintos string a mostrar en cada elemento del <ol>:
  function iniciar()
  {
    generarLista('lista1','uno','dos','tres','cuatro','cinco','seis');
  }
Finalmente la función generarLista que como podemos observar no tiene parámetros explícitos, sino que los accedemos luego mediante el objeto arguments. Disponemos un for que lo inicializamos en 1 ya que el argumento cero tiene el nombre del id del div:
  function generarLista()
  {
    var s='<ol>';
    var f;
    for(f=1;f<arguments.length;f++)
    {
      s=s+'<li>'+arguments[f]+'</li>';
    }
    s=s+'</ol>';
    var elemento1=document.getElementById(arguments[0]);
    elemento1.innerHTML=s;
  }
Mediante el método getElementById obtenemos la referencia del div que llega como parámetro en el arguments[0]. y luego mediante la propiedad innerHTML indicamos todo el código HTML que debe cargarse en el div. En este caso almacenamos en la variable s todas las marcas necesarios para generar la lista ordenada.

Javascript Parte LV

Para visitar todas las componentes de un vector hemos visto hasta ahora el ciclo repetitivo for:
<html>
<head>
</head>
<body>

<script type="text/javascript">
  
  var vec=[10,20,30,40,50];
  var f;
  for(f=0;f<vec.length;f++)
  {
    document.write(vec[f]+'-');
  }

</script>

</body>
</html>
Javascript cuenta con otra variante de for(llamada for in):
<html>
<head>
</head>
<body>

<script type="text/javascript">
  
  var vec=[10,20,30,40,50];
  for(var indice in vec)
  {
    document.write(indice);
    document.write(vec[indice]+'-');
  }
</script>

</body>
</html>
El for se repite tantas veces como elementos tiene el vector y en cada vuelta del ciclo for la variable indice almacena el subíndice de la componente (tengamos en cuenta que en este ejemplo definimos el vector con los valores 10,20,30,40,50 y se almacenaron en los subíndices 0,1,2,3,4) es decir la variable indice almacenará en la primer vuelta el valor 0, en la segunda el valor 1 y así sucesivamente:
  for(var indice in vec)
  {
    document.write(indice);
    document.write(vec[indice]+'-');
  }
Si tenemos un vector no denso (es decir que tiene algunas posiciones vacías el empleo del for in tiene un resultado distinto al empleo del for clásico):
<html>
<head>
</head>
<body>

<script type="text/javascript">
  
  var vec=[10,,30,,50];
  document.write('Recorredo del vector con un for clásico<br>');
  var f;
  for(f=0;f<vec.length;f++)
  {
    document.write(vec[f]+'-');
  }
  document.write('<br>');
  document.write('Recorredo del vector con un for in<br>');
  for(var indice in vec)
  {
    document.write(vec[indice]+'-');
  }
</script>

</body>
</html>
El resultado de la ejecución del programa es:
Recorrido del vector con un for clásico
10-undefined-30-undefined-50-
Recorredo del vector con un for in
10-30-50-
Como podemos comprobar con el for in no se acceden a componentes inexistentes.

Javascript Parte LIV

El método toString del objeto Array retorna un string con todos los elementos del vector separados por coma.
Problema
Crear un vector con 10 elementos con valores aleatorios comprendidos entre 0 y 1000. Luego copiar el contenido del vector a un string con los valores de las componentes separados por coma:
<html>
<head>
</head>
<body>

<script type="text/javascript">

  var vec=new Array(10);
  var f;
  for(f=0;f<vec.length;f++)
  {
    vec[f]=parseInt(Math.random()*1001);
  }
  var cadena=vec.toString();
  document.write(cadena);
 
</script>

</body>
</html>
El resultado de la ejecución del programa es (como son valores aleatorios es casi seguro que tendrá una lista de 10 valores distintos a estos):
348,860,430,568,428,692,281,159,573,284
Como podemos observar para copiar todas las componentes del vector en un string y que queden separadas por coma llamamos al método toString():
  var cadena=vec.toString();

Javascript Parte LIII

El método concat crea un nuevo vector con los datos del objeto original y los datos que le enviamos como parámetro.
Veamos con un ejemplo los resultados que obtenemos con el método concat:
<html>
<head>
</head>
<body>

<script type="text/javascript">

  var vec=[10,20,30,40];
  var vecnuevo=vec.concat(1,2,3);
  document.write('Vector origen<br>');
  document.write(vec.join()+'<br>');
  document.write('Vector generado<br>');
  document.write(vecnuevo.join()+'<br>');
 
</script>

</body>
</html>

Por pantalla tenemos el siguiente resultado:
Vector origen
10,20,30,40
Vector generado
10,20,30,40,1,2,3
El vector llamado vec almacena 4 componentes. Luego el vector que retorna el método concat es [10,20,30,40,1,2,3], el vector "vec" no se modifica al llamar al método concat. Como podemos observar los elementos que le pasamos como parámetro se almacenan al final del vector generado.
Otra variante es que podemos pasar como parámetros al metodo concat otros vectores:
<html>
<head>
</head>
<body>

<script type="text/javascript">

  var vec1=[10,20,30,40];
  var vec2=[100,200,300,400];
  var vecsuma=vec1.concat(vec2);
  document.write('Primer vector:');
  document.write(vec1.join()+'<br>');
  document.write('Segundo vector:');
  document.write(vec2.join()+'<br>');
  document.write('vectores concatenados:');
  document.write(vecsuma.join()+'<br>');
 
</script>

</body>
</html>
En pantalla tenemos como resultado:
Primer vector:10,20,30,40
Segundo vector:100,200,300,400
vectores concatenados:10,20,30,40,100,200,300,400
En este segundo problema tenemos dos vectores llamados vec1 y vec2. Llamamos al método concat a través del objeto vec1 y le pasamos como parámetro el vec2. El resultado es otro vector que se almacena la referencia en la variable vecsuma.
Luego mostramos los elementos de los vectores ayudándonos con la llamada del método join para generar un string con todos los elementos del vector separados por coma.


Fuente: 
http://www.tutorialesprogramacionya.com

Javascript Parte LII

El método join concatena todos los elementos del vector en un único string.
Al método join le pasamos como parámetro el o los caracteres de separación que debe agregar entre los elementos dentro del string que se genera.
Veamos un ejemplo del funcionamiento del método join:
<html>
<head>
</head>
<body>

<script type="text/javascript">
  
  var vec=[10,20,30,40,50]; 
  var cadena=vec.join('-');
  document.write(cadena);

</script>

</body>
</html>
El resultado en pantalla es:
10-20-30-40-50
Como podemos observar el string cadena almacena todos los elementos del vector separados por el caracter "-".
Podemos disponer más de un caracter de separación:
  var vec=[10,20,30,40,50]; 
  var cadena=vec.join('---');
  document.write(cadena); //10---20---30---40---50
Podemos llamar al método join inclusive sin parámetros, en dicho caso se agrega por defecto el caracter de la coma:
  var vec=[10,20,30,40,50]; 
  var cadena=vec.join();
  document.write(cadena);  //10,20,30,40,50