Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

143
Views
¿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 answers
Answer question

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!