Matrices en JavaScript

Importantes detalles sobre matrices en JavaScript

  1. Definición y uso básico de matrices (se numeran desde 0). Ej.: var arr = new Array() o “new Array(3)” o “[]” (si ponemos [3] es matriz con 1 elemento con valor 3); arr[0] = “coche”;
    arr.length – longitud de matriz. No solo leemos este valor, podemos escribir lo para redimencionar y nuevos elementos estaran sin definir. Cuidado no eliminar asi elementos.
    Semi foreach en JS:
    for(var coche in coches){
    alert(coches(coche));
    }
  2. Inicialización de matrices y matrices multidimensionales.
    var coches = new Array(“1″,”2″,”AD”); var coches = [“1″,”2″,”AD”]; var distintos = [“cadena”, 5, true];
    Multidimencionales: var dim1 = [1,2,3,4,5]; var dim2 = [1,2,3,4,5]; var dim2D = [dim1,dim2]; alert(dim2D[0][0]);
    Matrices escalonadas son las que contienen dentro matrices de diferentes dimenciones.
  3. Generar un alfabeto.
    Parseamos a numero: parseInt(“algo”);
    Comprobar si no es numero: if(isNaN(variable));
    Pide inputbox al usuario: prompt(“Pon numero”, “Valor defecto 26”);
    Cuando mostramos por pantalla matrices como string, separa valores con comas.
  4. Matrices asociativas: no los implemente realmente este tipo de matrices. Realmente es definicion de propiedades
    coches[“Alemanes”] = [“Audi”, “Volkswagen”, “Porsche”];
    alert(coches[“Alemanes”]) o por acceso a propiedad alert(coches.Alemanes);
  5. Manipulación de elementos de matrices.
    Unir en string usando elemento: var mEjemplo = [0,1,2,3,4,5]; mEjemplo.join(“–“); // Por defecto comas.
    Unir matrices: var mat1 = [1,2,3]; var mat2 = [“A”,”B”,”C”,”D”]; var nuevaMatriz = mat1.concat(mat2);
    Subconjunto de matrices (extracción): var subConjunto = sourceMatriz.slice(2,5); // Elementos del 2 al 5
    Matrices se pasan por referencia porque son objetos.
    Quitar elementos de matriz: matriz.splice(3,2) // Retira desde elemento 3, 2 elementos. Y resto de elementos se mueven para que no quedan huecos.
    Colas: var matriz = [1,2,3,4]; matriz.unshift(5,6) – meter al principio de cola; matriz.shift() – quita primer elemento.
    Pilas: var matriz = [1,2,3,4]; matriz.push(5) – meter en matriz; matriz.pop() – quita de matriz.
    Ordenacion:
    mat.reverse() (hace vuelta a elementos de matriz cambiando orden original de matriz);
    mat.slice().reverse() (copia matriz y invierte copia);
    mat.sort() (ordena la matriz como si fueran cadenas basando en valores unicode);
    Ordenacion especifica: var frutas = [“Naranjas”, “Pera”, “Melocoton”]; function ord(f1,f2){ return 0/1/2; frutas.sort(ord);
    Busquedas:
    mat.indexOf(“cadena buscada”) -> devuelve posición de primera ocurrencia de la cadena en la matriz.
    mat.indexOf(“cadena buscada”, 4) -> devuelve posición de primera ocurrencia de la cadena en la matriz despues de posición 4.
    lastIndexOf(“cadena buscada”) -> devuelve posición de ultima ocurrencia de la cadena en la matriz.
    Si se devuelve -1 -> no lo encuentra.
    Shims – funciones que sustituyen funciones si las primeras no existen.
    Procesamiento de elementos:
    Filtrar y extraer los que cumplen determinada condicion: var pares=mat.filter(esPar); function esPar(n){return n%2==0;}
    Indica si alguno cumple: mat.some(esPar);
    Indica si todos cumplen: mat.every(esPar);
    Aplica funcion a todos elementos en su retorno sin modificar matriz original: mat.map(elDoble); function elDoble(n){return n*2;}
    Map / Reduce para muchos datos.
    Aplicar funcion sin modificaciones: mat.forEach(mostrar); mostrar(n, indice, referenciaMatriz){alert(“Indice:”+indice+”,valor:”+n);

Detalles sobre JavaScript

Diferentes pequeños detalles de JavaScript que no se utilizan de forma muy habitual, pero que son bastante útiles.

  1. ScratchPatch (Firefox Shift+F4) – para escribir JS y ejecutar. Usa console.log(…) con consola (F12). Para poder hacer copy/paste escribir “permitir pegar” o “allow pasting” y CTRL+R.
    2.1. Operador ternario. Ej.: (n%2) == 0 ? alert(“numero par”) : alert(“numero impar”);
    2.2. Cortocircuito de expresiones lógicas. && o ||. Si primeras condiciones no se cumplen, resto no se verifican.
    2.3. Valores pseudo-Booleanos: Truly y Falsy (falsosos y verdosos). Ej.: if (window.Worker).
    Importante el orden: alert(“cualquier cosa” && true) -> true, alert( true && “cualquier cosa”); -> “cualquier cosa”. Operadores && y || devuelven valor de primer o segundo operando, no solo true/false. En && si primero es false, se devuelve primero, en || si primero es true se devuelve primer operando. Convertir algo en un booleano siempre con !!: !!”variable”. Se utiliza mucho en “return !!res;” en funciones.
  2. Uso avanzado de bucles determinados. Cambiar y complicar partes de los bucles. for (; i< 10; i++), for (var i = 0, j = 10; i< j; i++), for (var i = 0; ; i++), for (var i = 0, j = 0; i<10 && j < 5; i++, j++), for (;;)
  3. Uso de expresiones complejas con switch. Truco para tener condiciones complejas:
    switch (true) {
    case x > 0 && x < 10: alert(“x > 0 && x < 10”); break; case x > 0 && x < 20: alert(“x > 0 && x < 20”); break; case x < 0 || x > 100:
    alert(“x < 0 || x > 10”);
    break;
    default:
    alert(“Ninguno”);
    }
    5.1. Ámbito de las variables. Global desde cualquier parte de codigo (se define fuera de función). Local – solo dentro de una función.
    5.2. Shadowing u ocultamiento de variables. Cuando funcion tiene variable con mismo nombre en distinto ambito, prevalece la de ambito menor.
    5.3. Hoisting o elevación. Hay diferencia entre variable no definida y la que no existe. Si se define mas tarde, javascript lo mueve por dentro al principio de la función.
    5.4. Sobrecarga de funciones. Podemos tener mas argumentos de los definidos. Ej.:
    funcion sumarNumeros(){
    var parcial = 0;
    for (var i=0;i, <, etc.). Comparación teniendo en cuenta lenguaje indicado con “localeCompare”. Por defecto usa lenguaje de navegador.

Como crear métodos adicionales a clases existentes en C# como en JavaScript

Teniendo clases ya existentes sin heredar de ellos, les podemos añadir nuevos métodos (extensoras) en JavaScript gracias a los prototipos, pero en C# también es posible.

Para conseguir esto en C#:

En un fichero aparte, por ejemplo en carpeta Extensions creamos clase con siguiente código:

public static class StringExtensions
{
public static String trim(this String s)
{
return s.Trim();
}
}
Para utilizar:
String s = " Test ";
s = s.trim();

Parece un método propio, pero realmente es lo mismo que llamar a un método estático:
String s = " Test ";
s = StringExtensions.trim(s);

Formato JSON en respuestas SQL Server >= 2016

Se puede forzar a una base de datos normal, que devuelve datos en formato JSON. Para ello se necesita realizar modificaciones en la consulta.

Basicamente es instrucción “FOR JSON“, gracias a la cual SQL Server devuelve datos y les da formato JSON a los resultados de consulta.

Por ejemplo:

SELECT campo1, campo2 FROM tabla1 FOR JSON AUTO;

SELECT TOP (10) [TagId]
      ,[ValueBool]
      ,[ValueInt]
      ,[ValueFloat]
      ,[ValueStr]
      ,[ValueEnumId]
      ,[SourceTimestamp]
      ,[UpdateTimestamp]
      ,[QualityId]
      ,[QualityDetailId]
      ,[QualitySourceId]
  FROM [DBEjemplo].[System].[TagValues]
  FOR JSON AUTO, INCLUDE_NULL_VALUES