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

148
Vistas
¿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 Respuestas
Responde la pregunta

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 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