Skip to content

Commit a038b51

Browse files
authored
Merge pull request mouredev#6765 from cristophher087/patch-5
#3 - JavaScript
2 parents ecc8beb + 57a0b2b commit a038b51

File tree

1 file changed

+373
-0
lines changed

1 file changed

+373
-0
lines changed
Lines changed: 373 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,373 @@
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

Comments
 (0)