|
| 1 | +/** |
| 2 | + * Estructuras soportadas por JavaScript |
| 3 | + * |
| 4 | + * Tipado dinámico |
| 5 | + * |
| 6 | + * JS es un Lenguaje de prigramacion debilmente tipado y dinámico. |
| 7 | + */ |
| 8 | + |
| 9 | +let foo = 42; // foo ahora es un número |
| 10 | +foo = "bar"; // foo ahora es un string |
| 11 | +foo = true; // foo ahora es un booleano |
| 12 | + |
| 13 | +/** |
| 14 | + * Estructuras y tipso de datos |
| 15 | + * El último estándar ECMAScript define nueve tipos: |
| 16 | +*/ |
| 17 | + |
| 18 | +// Seis tipos de datos primitivos, controlados por el operador typeof |
| 19 | + |
| 20 | +typeof isntance === "undefined" |
| 21 | +typeof isntance === "boolean" |
| 22 | +typeof instance === "number" |
| 23 | +typeof instance === "string" |
| 24 | +typeof instance === "bigint" |
| 25 | +typeof instance === "symbol" |
| 26 | + |
| 27 | +typeof instance === "object" //Tipo primitivo especial que tiene un uso adicional para su valor: si el objeto no se hereda, se muestra null |
| 28 | + |
| 29 | +typeof instance === "object" //Tipo estructural especial que no es de datos pero para cualquier instancia de objeto construido que también se utiliza como estructuras de datos: new Object, new Array, new Map, new Set, new WeakMap, new WeakSet, new Date y casi todo lo hecho con la palabra clave new; |
| 30 | + |
| 31 | +typeof instance === "function" //Esta simplemente es una forma abreviada para funciones, aunque cada constructor de funciones se deriva del constructor Object. |
| 32 | + |
| 33 | +/** |
| 34 | + * Estructuras de Datos |
| 35 | + */ |
| 36 | + |
| 37 | +// Set: Conjunto de valores únicos |
| 38 | +let conjunto = new Set([1, 2, 3, 3]); |
| 39 | +console.log(conjunto); // {1, 2, 3} |
| 40 | +/** |
| 41 | + * Set define valores como se muestra en el ejemplo |
| 42 | + */ |
| 43 | + |
| 44 | +// Map: Estructura clave-valor |
| 45 | +let mapa = new Map(); |
| 46 | +mapa.set("nombre", "Carlos"); |
| 47 | +mapa.set("edad", 25); |
| 48 | +console.log(mapa.get("nombre")); // Carlos |
| 49 | +/** |
| 50 | + * Map Genera una estructura en donde s egenera una clave con su rsepectivo valor de este |
| 51 | + */ |
| 52 | + |
| 53 | +// WeakSet y WeakMap: Estructuras que contienen referencias débiles |
| 54 | +let weakSet = new WeakSet(); |
| 55 | +let objeto1 = { clave: 123 }; |
| 56 | +weakSet.add(objeto1); |
| 57 | + |
| 58 | +// No se puede iterar directamente un WeakSet |
| 59 | +console.log(weakSet.has(objeto1)); // true |
| 60 | + |
| 61 | + |
| 62 | +/** |
| 63 | + * Vectores (Arrays) en JavaScript |
| 64 | + * Un Array es una lista ordenada de elementos. En JavaScript, los arrays pueden contener cualquier tipo de dato (números, strings, objetos, etc.). |
| 65 | + */ |
| 66 | + |
| 67 | +let numeros = [1, 2, 3, 4, 5]; // Array de números |
| 68 | +let mezclado = [42, "texto", true, { id: 1 }]; // Elementos de distintos tipos |
| 69 | + |
| 70 | +/** |
| 71 | + * Inserciones |
| 72 | + */ |
| 73 | + |
| 74 | +// Inserción al final del array |
| 75 | +numeros.push(6); // [1, 2, 3, 4, 5, 6] |
| 76 | + |
| 77 | +// Inserción al inicio del array |
| 78 | +numeros.unshift(0); // [0, 1, 2, 3, 4, 5, 6] |
| 79 | + |
| 80 | +// Inserción en una posición específica (índice) |
| 81 | +numeros.splice(3, 0, 99); // [0, 1, 2, 99, 3, 4, 5, 6] |
| 82 | + |
| 83 | +/** |
| 84 | + * Eliminación de Elementos |
| 85 | + */ |
| 86 | + |
| 87 | +// Eliminar el último elemento |
| 88 | +numeros.pop(); // [0, 1, 2, 99, 3, 4, 5] |
| 89 | + |
| 90 | +// Eliminar el primer elemento |
| 91 | +numeros.shift(); // [1, 2, 99, 3, 4, 5] |
| 92 | + |
| 93 | +// Eliminar en una posición específica |
| 94 | +numeros.splice(2, 1); // [1, 2, 3, 4, 5] (elimina el valor en el índice 2) |
| 95 | + |
| 96 | +/** |
| 97 | + * Búsquedas en Arrays |
| 98 | + */ |
| 99 | + |
| 100 | +// Buscar el índice de un elemento |
| 101 | +let indice = numeros.indexOf(3); // 2 |
| 102 | + |
| 103 | +// Verificar si un elemento existe |
| 104 | +let existe = numeros.includes(4); // true |
| 105 | + |
| 106 | +// Búsqueda con función de condición |
| 107 | +let mayorQueTres = numeros.find(num => num > 3); // 4 |
| 108 | + |
| 109 | +/** |
| 110 | + * Recorrer un Array |
| 111 | + */ |
| 112 | + |
| 113 | +// Usando for |
| 114 | +for (let i = 0; i < numeros.length; i++) { |
| 115 | + console.log(numeros[i]); |
| 116 | +} |
| 117 | + |
| 118 | +// Usando for...of |
| 119 | +for (let num of numeros) { |
| 120 | + console.log(num); |
| 121 | +} |
| 122 | + |
| 123 | +// Usando forEach |
| 124 | +numeros.forEach((num, index) => { |
| 125 | + console.log(`Elemento en ${index}: ${num}`); |
| 126 | +}); |
| 127 | + |
| 128 | +/** |
| 129 | + * Matrices (Arrays Multidimensionales) |
| 130 | + * Una matriz es un array de arrays. Esto se usa para representar estructuras como tablas o grillas. |
| 131 | + */ |
| 132 | + |
| 133 | +let matriz = [ |
| 134 | + [1, 2, 3], |
| 135 | + [4, 5, 6], |
| 136 | + [7, 8, 9] |
| 137 | +]; |
| 138 | + |
| 139 | +/** |
| 140 | + * Acceso a Elementos |
| 141 | + */ |
| 142 | + |
| 143 | +let elemento = matriz[1][2]; // 6 (Fila 1, Columna 2) |
| 144 | + |
| 145 | +/** |
| 146 | + * Modificación de Elementos |
| 147 | + */ |
| 148 | + |
| 149 | +matriz[2][1] = 88; // Modifica el valor en la fila 2, columna 1 |
| 150 | +console.log(matriz); |
| 151 | +// Resultado: [ [1, 2, 3], [4, 5, 6], [7, 88, 9] ] |
| 152 | + |
| 153 | +/** |
| 154 | + * Recorrer una Matriz |
| 155 | + */ |
| 156 | + |
| 157 | +for (let fila of matriz) { |
| 158 | + for (let valor of fila) { |
| 159 | + console.log(valor); |
| 160 | + } |
| 161 | +} |
| 162 | + |
| 163 | +// Usando forEach |
| 164 | +matriz.forEach(fila => { |
| 165 | + fila.forEach(valor => console.log(valor)); |
| 166 | +}); |
| 167 | + |
| 168 | +/** |
| 169 | + * Operaciones Funcionales en Arrays (map, filter, reduce) |
| 170 | + */ |
| 171 | + |
| 172 | +/** |
| 173 | + * map: Crear un nuevo array transformando los elementos. |
| 174 | + */ |
| 175 | + |
| 176 | +let duplicados = numeros.map(num => num * 2); // [2, 4, 6, 8, 10] |
| 177 | + |
| 178 | +/** |
| 179 | + * reduce: Reducir el array a un solo valor. |
| 180 | + */ |
| 181 | + |
| 182 | +let suma = numeros.reduce((acumulador, actual) => acumulador + actual, 0); // 15 |
| 183 | + |
| 184 | +/** |
| 185 | + * Ejemplo |
| 186 | + */ |
| 187 | + |
| 188 | +// Crear una matriz 3x3 |
| 189 | +let matriz = [ |
| 190 | + [1, 2, 3], |
| 191 | + [4, 5, 6], |
| 192 | + [7, 8, 9] |
| 193 | +]; |
| 194 | + |
| 195 | +// Insertar un valor en una posición específica (fila 1, columna 1) |
| 196 | +matriz[1][1] = 99; |
| 197 | + |
| 198 | +// Sumar todos los elementos de la matriz |
| 199 | +let sumaTotal = matriz.flat().reduce((acc, val) => acc + val, 0); |
| 200 | +console.log(`Suma total: ${sumaTotal}`); // 144 |
| 201 | + |
| 202 | +// Filtrar todos los valores mayores que 5 |
| 203 | +let mayores = matriz.flat().filter(num => num > 5); |
| 204 | +console.log(`Mayores que 5: ${mayores}`); // [6, 7, 8, 9] |
| 205 | + |
| 206 | + |
| 207 | +let contactos = [ |
| 208 | + { nombre: "Carlos", telefono: "5558765123" }, |
| 209 | + { nombre: "María", telefono: "5512345678" }, |
| 210 | + { nombre: "Juan", telefono: "5578943210" }, |
| 211 | + { nombre: "Ana", telefono: "5587654321" }, |
| 212 | + { nombre: "Luis", telefono: "5612345678" }, |
| 213 | + { nombre: "Sofía", telefono: "5545678912" }, |
| 214 | + { nombre: "Pedro", telefono: "5556781234" }, |
| 215 | + { nombre: "Laura", telefono: "5598765432" }, |
| 216 | + { nombre: "Roberto", telefono: "5587123456" }, |
| 217 | + { nombre: "Daniela", telefono: "5567894321" } |
| 218 | +]; |
| 219 | + |
| 220 | +// Mostrar contactos iniciales |
| 221 | +mostrarContactos(); |
| 222 | + |
| 223 | +// Ciclo principal del programa |
| 224 | +while (true) { |
| 225 | + console.log("\nAgenda de contactos"); |
| 226 | + console.log("Digita la opción que quieres realizar:"); |
| 227 | + console.log("[b] - Búsqueda"); |
| 228 | + console.log("[i] - Inserción"); |
| 229 | + console.log("[a] - Actualización"); |
| 230 | + console.log("[e] - Eliminación"); |
| 231 | + console.log("[q] - Salir"); |
| 232 | + |
| 233 | + let opcion = prompt("¿Qué acción deseas realizar?").toLowerCase().trim(); |
| 234 | + |
| 235 | + switch (opcion) { |
| 236 | + case "b": |
| 237 | + consultaContacto(); |
| 238 | + break; |
| 239 | + case "i": |
| 240 | + ingresaContacto(); |
| 241 | + break; |
| 242 | + case "a": |
| 243 | + actualizaContacto(); |
| 244 | + break; |
| 245 | + case "e": |
| 246 | + eliminaContacto(); |
| 247 | + break; |
| 248 | + case "q": |
| 249 | + console.log("Saliendo de la agenda..."); |
| 250 | + process.exit(); // Solo en Node.js; en navegador, usar 'break' y finalizar el ciclo. |
| 251 | + default: |
| 252 | + console.log("Opción no válida. Inténtalo de nuevo."); |
| 253 | + } |
| 254 | +} |
| 255 | + |
| 256 | +// Función para mostrar todos los contactos |
| 257 | +function mostrarContactos() { |
| 258 | + console.log("\nContactos actuales:"); |
| 259 | + contactos.forEach((contacto, index) => |
| 260 | + console.log(`${index + 1}. Nombre: ${contacto.nombre}, Teléfono: ${contacto.telefono}`) |
| 261 | + ); |
| 262 | +} |
| 263 | + |
| 264 | +// Función para buscar un contacto por nombre |
| 265 | +function consultaContacto() { |
| 266 | + let nombreConsulta = prompt("Ingresa el nombre del contacto a buscar:").trim().toLowerCase(); |
| 267 | + let contacto = contactos.find(c => c.nombre.toLowerCase() === nombreConsulta); |
| 268 | + |
| 269 | + if (contacto) { |
| 270 | + console.log(`\nNombre: ${contacto.nombre}, Teléfono: ${contacto.telefono}`); |
| 271 | + } else { |
| 272 | + console.log(`No se encontró un contacto con el nombre "${nombreConsulta}".`); |
| 273 | + } |
| 274 | +} |
| 275 | + |
| 276 | +// Función para ingresar un nuevo contacto |
| 277 | +function ingresaContacto() { |
| 278 | + let nuevoNombre = prompt("Ingresa el nombre del nuevo contacto:").trim(); |
| 279 | + let nuevoNumero = prompt("Ingresa el número de teléfono (10 dígitos):").trim(); |
| 280 | + |
| 281 | + if (!/^\d{10}$/.test(nuevoNumero)) { |
| 282 | + console.log("Número inválido. Debe contener exactamente 10 dígitos."); |
| 283 | + return; |
| 284 | + } |
| 285 | + /** |
| 286 | + * "/^\d{10}$/" es una expresión regular (regex) que valida que la entrada nuevoNumero contenga exactamente 10 dígitos numéricos. |
| 287 | + * "^" y "$" aseguran que la cadena completa debe cumplir con el patrón (no puede haber otros caracteres). |
| 288 | + * "\d{10}" indica que deben ser exactamente 10 dígitos consecutivos. |
| 289 | + * El operador NOT (!) invierte el resultado de la expresión regular. Si el número no coincide con la regex (es decir, no tiene exactamente 10 dígitos), la condición se cumple. |
| 290 | + * .test(nuevoNumero): Este método prueba si el contenido de nuevoNumero coincide con la expresión regular. |
| 291 | + */ |
| 292 | + |
| 293 | + if (contactos.some(c => c.nombre.toLowerCase() === nuevoNombre.toLowerCase())) { |
| 294 | + console.log("El contacto ya existe. No se puede duplicar."); |
| 295 | + return; |
| 296 | + } |
| 297 | + /** |
| 298 | + * c => c.nombre.toLowerCase() === nuevoNombre.toLowerCase() es una función flecha (arrow function) que actúa como callback. Por cada elemento del array contactos, ejecuta el código dentro de esa función flecha. |
| 299 | + * La c no está definida antes porque es solo un parámetro temporal de la función flecha. |
| 300 | + * some() es un método de los arrays que retorna true si al menos un elemento del array cumple con la condición que se le pasa. |
| 301 | + * Se compara el nombre del contacto existente (c.nombre) con el nuevo nombre ingresado (nuevoNombre). |
| 302 | + * Ambos nombres se convierten a minúsculas con toLowerCase() para evitar errores por mayúsculas o minúsculas (por ejemplo, "Carlos" y "carlos" se tratarían como iguales). |
| 303 | + */ |
| 304 | + |
| 305 | + contactos.push({ nombre: nuevoNombre, telefono: nuevoNumero }); |
| 306 | + console.log("Contacto agregado exitosamente."); |
| 307 | + mostrarContactos(); |
| 308 | +} |
| 309 | + |
| 310 | +// Función para actualizar un contacto |
| 311 | +function actualizaContacto() { |
| 312 | + let nombreConsulta = prompt("Ingresa el nombre del contacto a actualizar:").trim().toLowerCase(); |
| 313 | + let contacto = contactos.find(c => c.nombre.toLowerCase() === nombreConsulta); |
| 314 | + |
| 315 | + if (contacto) { |
| 316 | + let nuevoNombre = prompt(`Ingresa el nuevo nombre (actual: ${contacto.nombre}):`).trim() || contacto.nombre; |
| 317 | + let nuevoNumero = prompt(`Ingresa el nuevo número (actual: ${contacto.telefono}):`).trim() || contacto.telefono; |
| 318 | + |
| 319 | + if (!/^\d{10}$/.test(nuevoNumero)) { |
| 320 | + console.log("Número inválido. Debe contener exactamente 10 dígitos."); |
| 321 | + return; |
| 322 | + } |
| 323 | + |
| 324 | + contacto.nombre = nuevoNombre; |
| 325 | + contacto.telefono = nuevoNumero; |
| 326 | + console.log("Contacto actualizado exitosamente."); |
| 327 | + mostrarContactos(); |
| 328 | + } else { |
| 329 | + console.log(`No se encontró un contacto con el nombre "${nombreConsulta}".`); |
| 330 | + } |
| 331 | +} |
| 332 | + |
| 333 | +// Función para eliminar un contacto |
| 334 | +function eliminaContacto() { |
| 335 | + let nombreConsulta = prompt("Ingresa el nombre del contacto a eliminar:").trim().toLowerCase(); |
| 336 | + let index = contactos.findIndex(c => c.nombre.toLowerCase() === nombreConsulta); |
| 337 | + |
| 338 | + if (index !== -1) { |
| 339 | + contactos.splice(index, 1); |
| 340 | + console.log("Contacto eliminado exitosamente."); |
| 341 | + mostrarContactos(); |
| 342 | + } else { |
| 343 | + console.log(`No se encontró un contacto con el nombre "${nombreConsulta}".`); |
| 344 | + } |
| 345 | +} |
| 346 | + |
| 347 | +/** |
| 348 | + ¿Qué es una expresión regular? |
| 349 | +
|
| 350 | +Es una secuencia de caracteres que define un patrón de búsqueda. Por ejemplo, /\d{10}/ es una expresión regular que busca 10 dígitos consecutivos. |
| 351 | +
|
| 352 | +Las expresiones regulares se delimitan entre barras /.../ (en JavaScript), y pueden incluir caracteres literales, metacaracteres (como . o \d), y modificadores para ampliar su funcionalidad. |
| 353 | +
|
| 354 | +Componentes básicos de una regex |
| 355 | +Metacaracteres (símbolos especiales): |
| 356 | +
|
| 357 | + . (punto): Representa cualquier carácter, excepto saltos de línea. |
| 358 | + Ejemplo: /c.t/ coincide con cat, cot, o cut. |
| 359 | +
|
| 360 | + \d: Representa cualquier dígito (equivale a [0-9]). |
| 361 | + Ejemplo: /\d/ encuentra cualquier número en la cadena "Tel: 123". |
| 362 | +
|
| 363 | + \w: Representa cualquier carácter alfanumérico (letras, números o guion bajo). |
| 364 | + Ejemplo: /\w+/ encuentra palabras como "hola123". |
| 365 | +
|
| 366 | + \s: Coincide con espacios en blanco (incluye tabulaciones y saltos de línea). |
| 367 | +
|
| 368 | + ^ y $: Marcan el inicio y fin de la cadena, respectivamente. |
| 369 | + Ejemplo: /^Hola/ verifica que la cadena empiece con "Hola". |
| 370 | + Ejemplo: /mundo$/ verifica que termine con "mundo". |
| 371 | +
|
| 372 | + |
| 373 | + */ |
0 commit comments