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

133
Vistas
Filtrado de objetos según el valor de una matriz de objetos

Estoy creando una aplicación para tomar notas en React y tengo algunos datos que se ven así. Quiero filtrarlo para que solo queden los objetos que contienen una etiqueta en una matriz, y el resto se elimine.

Datos sin procesar

 const obj = { Mon: [ { id: 1, content: 'Some text', tag: 'home' }, { id: 2, content: 'Some text', tag: 'work' }, { id: 3, content: 'Some text', tag: 'project' }, ], Tue: [ { id: 4, content: 'Some text', tag: 'project' }, { id: 5, content: 'Some text', tag: 'moving' }, ], Wed: [ { id: 6, content: 'Some text', tag: 'home' }, { id: 7, content: 'Some text', tag: 'home' }, { id: 8, content: 'Some text', tag: 'work' }, ], };

Datos deseados después de filtrar "casa" y "trabajo"

Matriz para usar como términos de filtrado

 const filterTags = ['home', 'work']

Datos que nos quedan

 { Mon: [ { id: 1, content: 'Some text', tag: 'home' }, { id: 2, content: 'Some text', tag: 'work' }, ], Wed: [ { id: 6, content: 'Some text', tag: 'home' }, { id: 7, content: 'Some text', tag: 'home' }, { id: 8, content: 'Some text', tag: 'work' }, ], };

La razón por la que quiero filtrar usando una matriz es porque quiero que un usuario pueda hacer clic en las etiquetas de las notas que quiere ver (estas etiquetas están actualmente almacenadas en useState() ).

Con los datos restantes después del filtrado, planeo mapearlos y representar los elementos relevantes de esta manera:

 <> {Object.entries(sortedNotesData).map( ([noteDate, noteContent], i) => ( <div key={i}> <NoteDate noteDate={noteDate} /> <div className="column"> {noteContent .map((note) => ( <> <NoteCard key={note.id} id={note.id} content={note.content} tag={note.tag} /> </> ))} </div> </div> ) )} </>

Cualquier sugerencia sobre una forma de mejor práctica para filtrar los datos sin procesar sería genial, incluso si sería mejor manejar el filtrado de datos en una función fuera de render() , o si se puede hacer en línea justo antes de .map() .

about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

  • Convierta el objeto en una matriz usando Object.entries .

  • Mapee sobre la matriz anidada y filtre los valores usando la matriz filterTags .

  • Elimine los días que no tengan elementos coincidentes.

  • Finalmente, convierta la matriz anidada nuevamente en un objeto usando Object.fromEntries

 const obj = { Mon: [ { id: 1, content: "Some text", tag: "home" }, { id: 2, content: "Some text", tag: "work" }, { id: 3, content: "Some text", tag: "project" }, ], Tue: [ { id: 4, content: "Some text", tag: "project" }, { id: 5, content: "Some text", tag: "moving" }, ], Wed: [ { id: 6, content: "Some text", tag: "home" }, { id: 7, content: "Some text", tag: "home" }, { id: 8, content: "Some text", tag: "work" }, ], }, filterTags = ["home", "work"], filteredObj = Object.fromEntries( Object.entries(obj) .map(([key, value]) => [ key, value.filter(({ tag }) => filterTags.includes(tag)), ]) .filter(([, value]) => value.length) ); console.log(filteredObj);

También puede conservar los días que no tienen elementos coincidentes simplemente eliminando el último filtro.

 const obj = { Mon: [ { id: 1, content: "Some text", tag: "home" }, { id: 2, content: "Some text", tag: "work" }, { id: 3, content: "Some text", tag: "project" }, ], Tue: [ { id: 4, content: "Some text", tag: "project" }, { id: 5, content: "Some text", tag: "moving" }, ], Wed: [ { id: 6, content: "Some text", tag: "home" }, { id: 7, content: "Some text", tag: "home" }, { id: 8, content: "Some text", tag: "work" }, ], }, filterTags = ["home", "work"], filteredObj = Object.fromEntries( Object.entries(obj).map(([key, value]) => [ key, value.filter(({ tag }) => filterTags.includes(tag)), ]) ); console.log(filteredObj);

about 4 years ago · Juan Pablo Isaza Denunciar

0

Similar a la respuesta de SSM, pero si no desea incluir días sin resultados

  • Convierta el objeto en una matriz utilizando Object.entries.
  • filtrar el contenido usando include en las etiquetas de filtro
  • solo agregue el día con resultado del filtro devuelve 1 o más resultados

.

 const obj = { Mon: [ { id: 1, content: 'Some text', tag: 'home' }, { id: 2, content: 'Some text', tag: 'work' }, { id: 3, content: 'Some text', tag: 'project' }, ], Tue: [ { id: 4, content: 'Some text', tag: 'project' }, { id: 5, content: 'Some text', tag: 'moving' }, ], Wed: [ { id: 6, content: 'Some text', tag: 'home' }, { id: 7, content: 'Some text', tag: 'home' }, { id: 8, content: 'Some text', tag: 'work' }, ], }; const filterTags = ['home', 'work'] //this will hold an object of results let filteredResults = {}; Object.entries(obj).forEach(day => { const name = day[0]; const filtered = day[1].filter(content => filterTags.includes(content.tag)) if (filtered.length > 0) { filteredResults[name] = filtered } }) console.log(filteredResults)

about 4 years ago · Juan Pablo Isaza 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