Emular el funcionamiento de un operador ternario ?: en ASP clásico con VBScript

Hemos hablado sobre el operador ternario ?: en Java o como emularlo en Python. Pero ¿Existe en el viejo VBScript? Pues no. ¿Qué soluciones tenemos?

Realmente cuando trabajamos en ASP Clásico el VBScript nos permite hacer un if-else en una sola línea tal que así:

If diaDeLaSemana < 6 Then seTrabaja = True Else seTrabaja = false

Por otra parte podríamos crear una función que emule su funcionamiento. Recibiría como parámetros una expresión que nos devuelva un valor booleano, una cadena que devolver en caso de que la expresión sea cierta y otra para el caso de que sea falsa:

Function IfT(bExpr, rVerdadera, rFalsa)
    If CBool(bExpr) Then
        IfT = rVerdadera
    Else 
        IfT = rFalsa
    End If
End Function

Veamos un ejemplo:

HoyQueHago = IfT(diaDeLaSemana < 6, "Currar", "Descansar")

Si el día de la semana es menor que seis (es decir, de lunes a viernes) devolvería “Currar” y si es mayor o igual (sábado o domingo) devolvería “Descansar“.

Javascript: funciones querySelector() y querySelectorAll()

Las funciones querySelector() y querySelectorAll() existen en Javascript como métodos del objeto document. Ambas nos permiten acceder a elementos del DOM utilizando un selector de CSS.

La función querySelector() nos devolverá el primer elemento que coincida con el selector que le pasemos. Si es un id no habría problema puesto que deberían ser únicos en el documento, pero si se tratase de una clase o un elemento HTML entonces nos devolvería solo la primera ocurrencia:

//Si es un id nos devolverá ese elemento
var i = document.querySelector('#Contenedor');

//pero si es un elemento que existe varias veces
//entonces solo tendremos la primera ocurrencia
var x = document.querySelector('p');

//esto pondría el fondo gris al primer p que haya 
//en nuestro documento
x.style.backgroundColor = "#d9d9d9";

¿Y si queremos todos los elementos?

En ese caso tenemos que usar querySelectorAll(). El funcionamiento es igual que el de querySelector(), pero en este caso nos devolverá un objeto Nodelist que contiene todos los elementos que coincidan con el selector que hemos buscado. En este caso no tendría sentido usarlo con id, ya que debería ser un elemento único.

//Aquí tendríamos una lista estática con todos los elementos p
var x = document.querySelector('p');

¿Y cómo accedemos a los elementos del Nodelist?

Al ser una lista podemos acceder a los elementos contenidos en el Nodelist que nos devuele querySelectorAll() mediante un índice. Podemos conocer el tamaño de la lista accediendo a la propiedad length e iterar todos los elementos dentro de un bucle:

//Aquí tendríamos una lista estática con todos los elementos p
var x = document.querySelector('p');

//ahora los recorremos y, para el ejemplo, cambiaremos el color
//de fondo por un gris
var i;
for (i = 0; i < x.length; i++) {
  x[i].style.backgroundColor = "#d9d9d9";
}

jQuery: Poner el foco en el siguiente elemento usando una clase

Os cuento: un cliente pide que en un formulario que está rellenando, con varios campos de texto muy pequeños para un solo carácter, el foco salte de forma automática al siguiente campo cada vez que cubre uno. Es decir, en cada evento de levantar la tecla salta al siguiente. La cosa parecía simple usando la función next() de jQuery:

$(".cuadrito").keyup(function() {
  $(this).next('.cuadrito').focus();	
});

La función next() de jQuery salta al siguiente elemento “hermano” que aparezca. ¿Qué quiere decir hermano? Pues que tengan el mismo padre, esto es que estén contenidos en el mismo elemento del DOM. Y por eso esta práctica y elegante solución no me valía, porque resulta que los inputs están dentro de una tabla, de forma que al cambiar de celda cambia el “padre” en el DOM y ya no salta el foco. ¿Qué hacer entonces? Lo solucioné con la función index():

$(".cuadrito").keyup(function() {	            
  var ind = $(".cuadrito").index(this);
  $(".cuadrito").eq(ind + 1).focus();
});

¿Qué hicimos aquí? Creo que en el pasado ya vimos que jQuery nos permite tratar a los elementos como si de un array se tratase. Simplemente estoy mirando en la primera fila qué índice tendría el elemento en el que nos encontramos y, en la siguiente, poniendo el foco en el posterior sumando 1 al índice.

Transformar una fecha de formato anglosajón (mm.dd.yyyy) a formato europeo (dd/mm/yyyy) con ASP clásico

Vamos con una entrada cortita. En el trabajo todavía usamos ASP clásico en uno de los proyectos y cuando usamos un campo de fecha en HTML5 en la vista hay que andar transformando de formato europeo a anglosajón y viceversa. ¿Cómo hacemos en ASP clásico esto?

Supongamos que tenemos una cadena con la fecha en formato mm.dd.yyyy, por ejemplo recibimos el 11.30.2018 de nuestro campo Date. ¿Cómo procedemos?

arFech = split(".","11.30.2018")
strFechaEuro = arFecha(1) & "/" & arFecha(0) & "/" & arFecha(2)

De esta forma la cadena strFechaEuro almacenaría el valor “30/11/2018

Operador ternario en Python

Hace un tiempo hablamos del operador ternario en Java, una forma de hacer operaciones condicionales en una sola línea con tres parámetros. Pero ¿existe algo similar en Python? Pues sí, existe:

No se trata de un operador, como el ? de Java, sino de una condición if-else un poco distinta a la clásica. La sintaxis sería algo así:

opción1 if condición else opción2

Veamos un ejemplo práctico:

#Declaramos una variable, le llamamos var
#Para el ejemplo le damos valor 1
var = 1
#Aplicamos la operación
resultado="Mayor que cero" if var>0 else "Menor o igual que cero"
#La variable resutado en este caso almacenaría "Mayor que cero"

Cómo saber si el valor de una variable es numérico en Python

A la hora de trabajar con datos numéricos en Python nos encontramos con un clásico ¿Cómo se que el valor que estoy recibiendo es un número? Casi todos los lenguages de programación tienen una función que nos permite evaluar si el valor almacenado en una variable es numérico, para el caso de Python vamos a ver dos opciones.

Python por defecto incluye una librería llamada math en todas sus versiones, pensada para realizar operaciones sobre datos escalares y para operaciones de trigonometría. Por otra parte existe una librería externa muy popular llamada numpy, pensada para el trabajo algebraico con matrices. Según el tipo de operaciones que vayas a realizar en tu código deberás importar una u otra.

En cualquier caso, ambas liberías tienen una función para chequear si una variable es numérica: la función isnan(), que devolverá true si el valor que está evaluando es nan (Not a Number). En el caso de usar la importada desde la librería math recibirá una sola variable y devolverá un valor booleano, en caso de usar la de numpy podrá recibir un array y evaluará todos los valores almacenados dentro del mismo, devolviendo según corresponda un valor booleano o un array de valores booleanos. Basta con importarla al principio de vuestro código y comprobarlo:

Con math en este caso devolvería true:

import math
x=float('cadena')
math.isnan(x)

Con numpy podemos trabajar con arrays:

import numpy as np
np.isnan([np.log(-1.),1.,np.log(0)])

Esto devolvería un array con un true para el primer valor evaluado y un false para los dos siguientes.

Ordenación de burbuja en Javascript

El método del intercambio directo, también llamado ordenación de burbuja (bubble sort en inglés), es un algoritmo de ordenamiento extremadamente sencillo que suele ser un ejercicio clásico en los cursos de programación para entender el uso de los bucles anidados en otros bucles. Funciona revisando cada elemento de la lista que va a ser ordenada con el siguiente, intercambiándolos de posición si están en el orden equivocado. Esto hace necesario revisar varias veces toda la lista, hasta que no se necesiten más intercambios. Por ello se trata de un algoritmo lento y poco eficiente.

La implementación de dicho algoritmo en una función de Javascript que recibe un array desordenado sería la siguiente:

//la función recibe un array desordenado
function burbuja(arr) {
 //Primer bucle, recore todo el array
 for (var i = 0; i < arr.length; i++) {
   //segundo bucle, va ordenando los elementos.
   for(var j=0; j  arr[j + 1]) {
      var el1 = arr[j];      
      arr[j] = arr[j + 1];
      arr[j + 1] = el1;
     }
   }
  }
  //al acabar la ordenación devulve el array, 
  //ahora ordenado
  return arr;
}