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

146
Visualizações
¿Cuál es la forma más rápida de encontrar una cadena parcial en matrices con filtro usando lodash?

¿Hay alguna forma de encontrar una cadena parcial en una matriz más rápido que la que tengo a continuación?

Aquí están mis datos de ejemplo:

 const products = [ { "product": "test1", "price": 11 }, { "product": "test2", "price": 31 }, { "product": "xxxx", "price": 21 }, { "product": "ssss", "price": 22 }, ]

Aquí están mis palabras clave (pero en realidad, hay muchas más):

 const keywords = [ "test", "xx" ]

Quiero filtrar productos con palabras clave y luego sumar todos los precios del producto que debería tener mi salida

63

Esto es lo que traté de hacer: primero filtro mis productos, estoy usando indexOf porque es más rápido que includes :

 const fil = _.filter(products, (product) => { return _.some(keywords, (v) => product.name.indexOf(v) >= 0 ); });

luego los sumo usando reduce :

 const sum = fil.reduce(function (sum, data) { return sum + data.price; }, 0);

Todo funciona bien, pero si tengo que trabajar con alrededor de 300 000 elementos y 100 000 palabras clave, se tarda unos 3 minutos en encontrar esta consulta. ¿Hay alguna forma de disminuir ese tiempo? (Los valores del product son muy únicos, no hay muchos duplicados).

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

0

Ha dicho que solo necesita la suma, no la lista de productos filtrados, por lo que podemos reducir ese tiempo ligeramente , pero probablemente no mucho, por:

  1. Reducir la cantidad de rotación de memoria al no producir una matriz que no necesitamos
  2. No hacer dos pasadas por products cuando solo necesitamos una.
  3. Evitar las llamadas a funciones (aunque las llamadas a funciones son rápidas en los motores de JavaScript)

Asi que:

 let sum = 0; for (const {product, price} of products) { for (const keyword of keywords) { if (product.includes(keyword)) { sum += price; break; } } }

Eso usa el bucle new(ish) for-of . Sin embargo, bajo las cubiertas, for-of implica llamadas a funciones y la creación de objetos (aunque al recorrer una matriz nativa, el motor de JavaScript puede optimizarlos por completo). Es posible que desee probarlo con un bucle for ver cuál le brinda la mejor velocidad:

 let sum = 0; let productsLength = products.length; let keywordsLength = keywords.length; let pIndex, kIndex; for (pIndex = 0; pIndex < productsLength; ++pIndex) { const {product, price} = products[pIndex]; for (kIndex = 0; kIndex < keywordsLength; ++kIndex) { if (product.includes(keywords[kIndex])) { sum += price; break; } } }

De manera similar, experimente colocando las variables de bucle dentro de la parte for (...) en lugar de tenerlas afuera como se indicó anteriormente, pero tiendo a pensar que afuera sería un poquito más rápido (debido a cómo funciona let en los bucles for ) .

Y, por último, puede compararlo con el uso del forEach nativo (no forEach ) y some métodos en lugar de bucles for .

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