¿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).
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:
products cuando solo necesitamos una.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 .