Obtuve una matriz de nuestro servidor que contiene 2400 objetos (el tamaño total es de aproximadamente 7 MB) y quiero filtrar algunos de los primeros valores en ella. En este momento estoy usando una combinación de filter y método de slice :
const keyword = 'whatever word'; const recommendList =bigArray.filter(item => item.name.includes(keyword)).slice(0, 5); Lo que sé es que el método de filter itera todo el elemento en la matriz y creo que puede afectar el rendimiento de mi aplicación (React Native) debido a su gran cantidad de datos. Entonces, ¿hay algún enfoque para filtrar la matriz por algunos valores, sin iterar todos los elementos?
const keyword = 'whatever word'; const recommendList = []; for (let i=0; i<bigArray.length; i++) { if ( recommendList.length >= 5) break; const item = bigArray[i]; if (item.name.includes(keyword)) recommendList.push(item); }Si simplemente desea romper (detener) el ciclo cuando encuentre el quinto elemento, puede hacer lo siguiente:
const keyword = 'v'; const bigArray = ['a','v','a','v','a','v','a','v','a','v','a','v','a','v','a','v','a','v']; const recommendList = []; for (let i=0; i<bigArray.length; i++) { // loop till you reach end of big array index if (recommendList.length == 5) // if length is 5 this will break the loop { break; } if (bigArray[i].includes(keyword)) { recommendList.push(bigArray[i]); // add if you find } } console.log(recommendList);Si no quiere usar la operación lambda, simplemente puede usar, algunos, encontrar, etc., que solo funcionan hasta que devuelven la primera respuesta como verdadera
const bigArray = [{ "name": "a" }, { "name": "v" }, { "name": "a" }, { "name": "v" }, { "name": "a" }, { "name": "v" }, { "name": "a" }, { "name": "v" }, { "name": "a" }, { "name": "v" }, { "name": "a" }, { "name": "v" }, { "name": "a" }, { "name": "v" }, { "name": "a" }, { "name": "v" }, { "name": "a" }, { "name": "v" } ]; const keyword = 'v'; const recommendList = []; // some operator only iterates till its condition returns true // so if we get 5 recommended list before the bigArray end we return true and stop the iteration. bigArray.some(obj => { if (obj.name.includes(keyword)) { recommendList.push(obj) } return recommendList.length === 5; // return true if 5 values are found, that will terminate the iteration }) console.log(recommendList);El enfoque más eficiente es procesar la matriz como una secuencia iterable.
El siguiente ejemplo se basa en la biblioteca iter-ops :
import {pipe, filter, take} from 'iter-ops'; const i = pipe( bigArray, filter(item => item.name.includes(keyword)), take(5) ); console.log('matches:', [...i]);De esta manera, no estará iterando todo ni una sola vez, se detendrá justo cuando se encuentren las primeras 5 coincidencias.