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

153
Views
Rendimiento de JavaScript para iterar y acceder a elementos

Tengo una variedad de elementos que a veces necesito iterar y, a veces, acceder a un miembro directamente. Así que decidí mantener las referencias en dos variables, una matriz y un objeto. Hago algo como esto:

 const itemsArr = []; const itemsObj = {}; const addItem = (data) => { const item = { id: data.id, name: data.name }; itemsArr.push(item); itemsObj[data.id] = item; } const removeItem = (data) => { let i; for (i = 0; i < itemsArr.length; i++) { if (itemsArr[i].id === data.id) { itemsArr.splice(i, 1); break; } } itemsObj[data.id] = null; delete itemsObj[data.id]; } const getWithId = (id) => { return itemsObj[id]; } const getWithName = (name) => { let i; for (i = 0; i < itemsArr.length; i++) { if (itemsArr[i].name === name) { return itemsArr[i]; } } return null }

Así que administro dos objetos y uso uno u otro según la tarea. Siento que esta es la forma más eficaz, pero tal vez haya mejores formas para esto, como un Mapa o Conjunto.

¿Existe una única estructura de datos de JavaScript que supere las matrices en la iteración y los objetos en la búsqueda?

Creo que Object.keys tiene costos de rendimiento adicionales para iterar un objeto, de manera similar Array.filter para buscar en una matriz, por lo que mi intuición es usar matrices para la iteración y objetos para la búsqueda, pero si hay una sola estructura de datos que está optimizada para ambos, me gustaría saber y usar solo un items en mi código.

Gracias

about 4 years ago · Juan Pablo Isaza
1 answers
Answer question

0

Primero, para la parte de búsqueda por id, sugeriría un Map , no un objeto. Los objetos están optimizados para el caso de uso de programación común donde su conjunto de propiedades es bastante consistente a lo largo del tiempo (los valores pueden cambiar, pero la forma del objeto [qué propiedades tiene] en su mayoría no lo hace). Map está optimizado como un almacén general de nombre/valor que maneja mejor ese caso de uso. Más en esta página de MDN .

¿Existe una única estructura de datos de Javascript que supere las matrices en la iteración y los objetos en la búsqueda?

No, pero la diferencia en la velocidad de iteración entre un Map y una matriz no importará en la gran mayoría de las aplicaciones. Sí, una matriz será más rápida en la mayoría de los casos (depende un poco de cómo se construya la matriz), pero es muy poco probable que importe.

Pero si solo accede por id o name , no está iterando de todos modos. Es posible que desee dos mapas en lugar de un mapa y una matriz, ya que de esa manera encontrar elementos de cualquier manera es sublineal en lugar de lineal. También hace que el código sea más simple:

 const itemsByName = new Map(); const itemsById = new Map(); const addItem = (data) => { const item = { id: data.id, name: data.name }; itemsByName.set(data.name, data); itemsByid.set(data.id, data); }; const removeItem = (data) => { itemsByName.delete(data.name); itemsByid.delete(data.id); }; const getWithId = (id) => { return itemsById.get(id); }; const getWithName = (name) => { return itemsByName.get(name); };

FWIW, si no tenía itemsByName en lo anterior porque no necesitaba que la búsqueda de name fuera sublineal, así es como se vería el código para getWithName usando itemsById :

 const getWithName = (name) => { for (const item of itemsById.values()) { if (data.name === name) { return data; } } return null; };
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!