Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

101
Visualizações
Filtrar objetos de matriz de 2 dimensiones por texto

Necesito filtrar una matriz bidimensional en JS, sé que existe el acumulador, ¿podría explicarme cómo hacerlo, por favor?

 let listItems = [ { category: false, items: [ { value: 1, label: 'Disabled'}, { value: 2, label: 'Carole Poland'}, { value: 3, label: 'Wanda Howard'}, ], }, { category: 'Suggestions', items: [ { value: 4, label: 'Robin Counts'}, { value: 5, label: 'Alex Doe'}, ], }, { category: 'Batiment', items: [ { value: 6, label: 'Vincent Howi'}, { value: 7, label: 'Alex Zusk'}, ], } ];

Resultado buscado después de filtrar por etiqueta 'Alex'

 let listItems = [ { category: 'Batiment', items: [{ value: 7, label: 'Alex Zusk'}] }, { category: 'Suggestions', items: [{ value: 5, label: 'Alex Doe'}] } ]; <input type="text" id="myInput" onkeyup="myFunction()" placeholder="Search.." /> function myFunction() { input = document.getElementById("myInput"); filter = input.value.toUpperCase(); console.log('Search :', filter); }

https://jsfiddle.net/z03gjdpo/4/

about 4 years ago · Juan Pablo Isaza
3 Respostas
Responde à pergunta

0

  • Usando Array#reduce , itere sobre la matriz mientras actualiza una lista.
  • En cada iteración, utilizando Array#filter y String#includes , obtenga elementos cuya etiqueta incluya la cadena de destino. Si estos últimos existen, empuje un nuevo objeto al acumulador con category y items filtrados.

 const listItems = [ { category: false, items: [ { value: 1, label: 'Disabled'}, { value: 2, label: 'Carole Poland'}, { value: 3, label: 'Wanda Howard'} ] }, { category: 'Suggestions', items: [ { value: 4, label: 'Robin Counts'}, { value: 5, label: 'Alex Doe'} ] }, { category: 'Batiment', items: [ { value: 6, label: 'Vincent Howi'}, { value: 7, label: 'Alex Zusk'} ] } ]; const target = 'Alex'; const filteredListItems = listItems.reduce((list, { category, items = [] }) => { const filteredItems = items.filter(({ label }) => label.includes(target)); if(filteredItems.length > 0) { list.push({ category, items: filteredItems }); } return list; }, []); console.log(filteredListItems);

about 4 years ago · Juan Pablo Isaza Relatório

0

Otro enfoque es usar flatMap para que sirva como una combinación de filter y map , así:

 const byLabel = (xs) => (target) => xs .flatMap ( ({items, ...rest}, _, __, filteredItems = items .filter (({label}) => label .includes (target)) ) => filteredItems .length ? [{...rest, items: filteredItems}] : []) const listItems = [{category: false, items: [{value: 1, label: "Disabled"}, {value: 2, label: "Carole Poland"}, {value: 3, label: "Wanda Howard"}]}, {category: "Suggestions", items: [{value: 4, label: "Robin Counts"}, {value: 5, label: "Alex Doe"}]}, {category: "Batiment", items: [{value: 6, label: "Vincent Howi"}, {value: 7, label: "Alex Zusk"}, {value: 8, label: "Alex Again"}]}] console .log (byLabel (listItems) ('Alex'))
 .as-console-wrapper {max-height: 100% !important; top: 0}

Filtramos cada lista de elementos de la manera habitual y luego incluimos una matriz vacía, si el resultado filtrado está vacío, o una matriz que contiene una copia del objeto original con los resultados filtrados reemplazando a los originales.

Los parámetros _ y __ son solo marcadores de posición porque flatMap pasa parámetros de índice y matriz que queremos ignorar.

about 4 years ago · Juan Pablo Isaza Relatório

0

¡Me gusta el enfoque con reduce! Alternativamente, también podría hacer "filtro doble" (filtro anidado):

 function getItemsByLabel(listItems, label) { return listItems.filter((item) => { const filtered = item.items.filter((inner) => { return inner.label.toLowerCase().indexOf(label.toLowerCase()) >= 0; }); if (filtered.length) { item.items = filtered; }; return filtered.length; }) } console.log(getItemsByLabel(listItems, 'alex'));
about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda