Si te encuentras con algo que no entiendes nos puedes dejar un comentario y haremos todo lo necesario de ayudarte rápidamente.
Solución:
Su código realmente hace esto: si la ciudad ‘Varsovia’ existe en la lista y la posición ‘Desarrollador web’ existe en la lista, entonces consígame todas las personas con un salario superior a 2k. Dado que las dos primeras condiciones son true según sus datos de muestra (tautología), el código que escribió devuelve a todas las personas de la lista con un salario superior a 2k, que es lo que observó y terminó aquí.
En este punto, le sugiero que piense si la estructura de datos que tiene es adecuada para filtrar personas según esos criterios. Pero digamos que debe ceñirse a la representación de datos actual. Además, el código que escribió y copió Barmar es increíblemente ineficiente. Esto es lo que (juicioso) humano haría para completar tal tarea:
- Localice ‘Varsovia’ en la lista de lugares de trabajo y resáltelo con un rotulador; ir
8.
, si no se encuentra. - Busque ‘Desarrollador web’ en la lista de trabajos y resáltelo con un rotulador; ir
8.
, si no se encuentra. - Busque la primera persona con un salario> 2000; ir
8.
, si no se encuentra. - Busque el nombre de la persona en la lista de personas de la ciudad resaltada; ir
8.
, si no se encuentra. - Busque el nombre de la persona en la lista de trabajadores del trabajo resaltado; ir
8.
, si no se encuentra. - Sí, encontré un registro que coincide con los criterios, ¡envíalo a la salida!
- Busque la siguiente persona con salario> 2000; ir
4.
, si se encuentra. - ¡Hecho!
¿Viste algún bucle for en el algoritmo anterior? Bueno, algunos dirían que los bucles están ocultos allí. Y eso es true, pero hoy en día tenemos funciones de orden superior (espero que no te importe el código Python) que hacen exactamente lo mismo: esconden bucles en ellas. Un ejemplo de tal función es Array.Filter
. Toma un argumento de devolución de llamada (delegado, lambda, predicado, función de flecha, callitwhatyouwant, etc.) que se ejecuta exactamente una vez para cada elemento en el array para que aparezcan en array. La devolución de llamada decide si el elemento específico debe mantenerse en el resultado array. El resultado de la función es un nuevo array lleno de elementos para los que devolvió la función de devolución de llamada true
. Comencemos a construir sobre esta función.
const array = people.filter(person => person.salary > 2000);
Aquí pasé una función de flecha como parámetro, debido a su sintaxis concisa. Esta línea de código implementa efectivamente el paso #3
y #7
del algoritmo anterior. Aquí está el código de los pasos #1
y #2
:
const warsaw = workplace.find(aWorkplace => aWorkplace.city === 'Warsaw');
const webDeveloper = workplace && job.find(aJob => aJob.position === 'Web developer');
Usé la función Array.find para ubicar los registros requeridos. Esto, por supuesto, asume que el nombre de la ciudad y el nombre de la posición son únicos dentro de la array. ¿Todavía recuerdas ese punto sobre las estructuras de datos? Pero no importa, dejémoslo de lado. workplace &&
en la segunda línea es para evitar una búsqueda sin sentido, en caso de que no se encuentre “Varsovia”. Ahora para ponerlo todo junto:
const warsaw = workplace.find(aWorkplace => aWorkplace.city === 'Warsaw');
const webDeveloper = workplace && job.find(aJob => aJob.position === 'Web developer');
const array = (warsaw && webDeveloper && people.filter(person =>
person.salary > 2000 &&
warsaw.persons.includes(person.name) &&
webDeveloper.workers.includes(person.name)
)) || [];
Sé que podría haber omitido warsaw &&
en la tercera línea, pero prefiero mantenerlo ahí para no introducir un “acertijo” en la lógica.
Entonces que hemos aprendido aquí? ¿Por qué tuvimos que pasar por esto? Si compara el original for
-Código basado en bucle al anterior, descubrirá rápidamente que este último es más legible, porque básicamente está escrito en inglés simple y es más eficiente, porque evita realizar pasos innecesarios.
Y como beneficio adicional, tal vez hoy fue el día en que aprendió algo sobre las funciones de orden superior y las funciones de flecha.
Aquí está el fragmento.
var people = [
'name': 'Viola', 'salary': 2500, 'surname': 'Smith',
'name': 'Boris', 'salary': 1300, 'surname': 'Popkovitch',
'name': 'John', 'salary': 500, 'surname': 'Lynn',
'name': 'Tom', 'salary': 3300, 'surname': 'Gates',
'name': 'Levis', 'salary': 900, 'surname': 'Klark',
];
var workplace = [
'city': 'New York', 'persons': ['Viola'],
'city': 'Manchester', 'persons': ['John', 'Boris'],
'city': 'Warsaw', 'persons': ['Tom', 'Levis'],
];
var job = [
'position': 'Head manager', 'workers': ['Boris'],
'position': 'Web developer', 'workers': ['Tom', 'Viola'],
'position': 'Principal', 'workers': ['Levis', 'John']
];
const warsaw = workplace.find(aWorkplace => aWorkplace.city === 'Warsaw');
const webDeveloper = workplace && job.find(aJob => aJob.position === 'Web developer');
const array = (warsaw && webDeveloper && people.filter(person =>
person.salary > 2000 &&
warsaw.persons.includes(person.name) &&
webDeveloper.workers.includes(person.name)
)) || [];
console.log(array);
Mi última observación es que usaste un identificador people
, que implica plural, y eso está bien, pero para las listas restantes usó sustantivos singulares – workplace
y job
. Te recomiendo que mantengas la coherencia en los nombres, porque también mejora en gran medida la legibilidad del código.
Necesitas probar si people[x].name
es en workplace[y].persons
y job[z].workers
.
var people = [
'name': 'Viola', 'salary': 2500, 'surname': 'Smith',
'name': 'Boris', 'salary': 1300, 'surname': 'Popkovitch',
'name': 'John', 'salary': 500, 'surname': 'Lynn',
'name': 'Tom', 'salary': 3300, 'surname': 'Gates',
'name': 'Levis', 'salary': 900, 'surname': 'Klark',
];
var workplace = [
'city': 'New York', 'persons': ['Viola'],
'city': 'Manchester', 'persons': ['John', 'Boris'],
'city': 'Warsaw', 'persons': ['Tom', 'Levis'],
];
var job = [
'position': 'Head manager', 'workers': ['Boris'],
'position': 'Web developer', 'workers': ['Tom', 'Viola'],
'position': 'Principal', 'workers': ['Levis', 'John']
];
var array = [];
for (var x = 0; x < people.length; x++)
for (var y = 0; y < workplace.length; y++)
for (var z = 0; z < job.length; z++)
if (workplace[y].city === 'Warsaw' && job[z].position === 'Web developer' && people[x].salary > 2000
&& job[z].workers.includes(people[x].name)
&& workplace[y].persons.includes(people[x].name))
array.push(people[x]);
;
console.log(array);
Si te gustó nuestro trabajo, tienes la libertad de dejar un escrito acerca de qué te ha gustado de esta sección.