javascript loops if-statement

javascript - ¿Cómo mostrar objetos de matriz utilizando un bucle simple y declaraciones if?



loops if-statement (2)

Tengo 3 matrices y un par de bucles simples. Quiero especificar 3 condiciones que mostrarían a una persona de Varsovia en la posición de desarrollador web con un salario superior a 2000. El problema es que muestra dos registros en lugar de uno.

He intentado escribir las condiciones dentro de cada bucle, pero ninguna de mis combinaciones funcionó.

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) { array.push(people[x]); } } } }; console.log(array);

Espero que el código devuelva solo el objeto Tom, no Tom y Viola. ¿Alguna idea?


Lo que realmente hace su código es 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 verdaderas en sus datos de muestra ( tautology ), 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 a las personas según esos criterios. Pero digamos que necesita atenerse a la representación de datos actual. Además, el código que escribiste y Barmar copió es increíblemente ineficiente. Esto es lo que haría un humano (juicioso) para completar esa tarea:

  1. Localice ''Varsovia'' en la lista de lugares de trabajo y resáltelo con un rotulador; ir a 8. , si no se encuentra.
  2. Localice ''Desarrollador web'' en la lista de trabajos y resáltelo con un rotulador; ir a 8. , si no se encuentra.
  3. Encuentra primera persona con sueldo> 2000; ir a 8. , si no se encuentra.
  4. Buscar el nombre de la persona en la lista de personas destacadas de la ciudad; ir a 8. , si no se encuentra.
  5. Buscar el nombre de la persona en la lista de trabajadores del trabajo resaltado; ir a 8. , si no se encuentra.
  6. Yay, he encontrado un registro que coincide con los criterios, ¡póngalo en la salida!
  7. Encuentra la siguiente persona con salario> 2000; ir a 4. , si se encuentra.
  8. ¡Hecho!

¿Has visto algún bucle for en el algoritmo anterior? Bueno, algunos dirían que los bucles están escondidos allí. Y eso es cierto, pero hoy en día tenemos funciones de orden superior (espero que no te importe el código de Python) que hacen exactamente lo mismo: oculta bucles en ellas. Un ejemplo de tal función es Array.Filter . Toma el argumento de devolución de llamada (delegado, lambda, predicado, función de flecha, callitwhatyouwant ...) que se ejecuta exactamente una vez para cada elemento de la matriz en el orden en que aparecen en la matriz. La devolución de llamada decide si el elemento específico debe mantenerse en la matriz resultante. El resultado de la función es una nueva matriz llena de elementos para los cuales la función de devolución de llamada devolvió true . Vamos a empezar 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 los pasos #3 y #7 del algoritmo anterior. Aquí está el código para los pasos #1 y #2 :

const warsaw = workplace.find(aWorkplace => aWorkplace.city === ''Warsaw''); const webDeveloper = workplace && job.find(aJob => aJob.position === ''Web developer'');

Array.find función Array.find para localizar 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 matriz. ¿Aún recuerdas ese punto sobre las estructuras de datos? Pero no importa, dejémoslo a un lado. workplace && en la segunda línea es para evitar búsquedas sin sentido, en caso de que no se encuentre ''Warsaw''. 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 allí para no introducir un "rompecabezas" en la lógica.

Entonces que hemos aprendido aquí? ¿Por qué tuvimos que pasar por esto? Si compara el código original basado en bucle for con el de arriba, rápidamente descubrirá que este último es más legible, porque está básicamente escrito en un lenguaje sencillo y más eficiente, porque evita realizar pasos innecesarios. Y como ventaja, 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 observación final es que usaste people identificadoras, lo que implica plural, y eso está bien, pero para las listas restantes usaste sustantivos singulares: workplace y job . Te recomendaría que mantengas la coherencia de nombre, ya que también mejora enormemente la legibilidad del código.


workplace[y].persons probar si la people[x].name está en el workplace[y].persons de 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);