Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

116
Vistas
Filtrado por varios parámetros a la vez

Necesito implementar el filtrado de usuarios de acuerdo con las reglas que vienen con el archivo JSON junto con los usuarios. Hay dos tipos de reglas: "excluir" e "incluir". Pueden venir individualmente o dos a la vez. En este momento, mi código funciona bien cuando entran dos reglas a la vez. Pero cuando solo hay una regla, el error en la consola es No se pueden leer las propiedades de undefined (leyendo 'forEach'). ¿Cómo se puede resolver este problema?

Usuarios y reglas:

 { "data": [{ "user": "user1", "city": "New York", "disabled": false }, { "user": "user2", "city": "London", "disabled": false }, { "user": "user3", "city": "Tokyo", "disabled": true } ], "condition": { "exclude": [{ "disabled": true }], "include": [{ "city": "New York", }], } }

 const data = responseJson.then((data) => { var filteredUsers = advancedFilter(data.data, data.condition); console.log(filteredUsers); }); function advancedFilter(data, condition) { return data.filter((dataItem) => { var cond = true; if ("exclude" in condition || "include" in condition) { condition.exclude.forEach((condItem) => { for (var key in condItem) { cond = cond && dataItem[key] !== condItem[key]; } }); condition.include.forEach((condItem) => { for (var key in condItem) { cond = cond && dataItem[key] === condItem[key]; } }); } return cond; }); }

about 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Solo necesita hacer dos condiciones if por separado, por lo que si hay una condición de exclude , ejecute forEach en la exclusión. Además, si hay una condición de include , ejecute forEach en la inclusión.

El error ocurre porque realiza un bucle para include y exclude incluso si uno de ellos no existe.

 const responseJson = { "data": [{ "user": "user1", "city": "New York", "disabled": false }, { "user": "user2", "city": "London", "disabled": false }, { "user": "user3", "city": "Tokyo", "disabled": true } ], "condition": { "exclude": [{ "disabled": true }], "include": [{ "city": "New York", }], } } var filteredUsers = advancedFilter(responseJson.data, responseJson.condition); console.log(filteredUsers); function advancedFilter(data, condition) { return data.filter((dataItem) => { var cond = true; if ("exclude" in condition) { condition.exclude.forEach((condItem) => { for (var key in condItem) { cond = cond && dataItem[key] !== condItem[key]; } }); } if ("include" in condition) { condition.include.forEach((condItem) => { for (var key in condItem) { cond = cond && dataItem[key] === condItem[key]; } }); } return cond; }); }

about 4 years ago · Santiago Trujillo Denunciar

0

Recomendaría dividir la lógica en dos declaraciones if, así:

 if ("exclude" in condition) { condition.exclude.forEach((condItem) => { for (var key in condItem) { cond = cond && dataItem[key] !== condItem[key]; } }); } if ("include" in condition) { condition.include.forEach((condItem) => { for (var key in condItem) { cond = cond && dataItem[key] === condItem[key]; } }); }

De esta manera, no intentará leer algo indefinido, ya que habrá verificado que la propiedad está presente.

about 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda