Mi caso es que necesito almacenar una clave única para realizar un seguimiento de mis millones de modelos en Javascript y almacenar el par clave-valor en un Mapa.
Hay una biblioteca uuid existente que generará una clave de cadena para mí, pero me temo que necesitaría una clave entera para lograr un rendimiento óptimo. Sin embargo, parece que tendré que convertir la cadena uuid en un entero único, lo cual no es trivial y también tiene una sobrecarga.
¿Hay una diferencia significativa al usar una cadena como clave para un mapa o un número entero?
Aquí hay una solución basada en nuestra conversación.
Hay muchas formas similares de hacer esto, pero la clave es almacenar el índice inverso para la búsqueda en el propio modelo, de modo que cada modelo "sabe" dónde se encuentra en el índice del modelo.
Editar: hubo un error en mi primer ejemplo que habría aparecido cuando la matriz se volvió escasa debido a la reducción de array.length.
Este es un ejemplo más avanzado que elimina el error y tiene una clase dataIndex que es responsable de la indexación y donde los modelos pueden tener búsquedas inversas para múltiples índices.
class dataIndex { constructor(indexId) { this.vec = []; this.indexId = indexId; this.indexNext = 0; } indexModel(model) { this.vec[model.lookup[this.indexId] = this.indexNext++] = model; return this; } } class dataModel { constructor(data) { this.data = data; this.lookup = new Map(); } static compareData(a, b) { return (a.data === b.data) ? 0: (a.data > b.data) ? 1 : -1; } } const modelIndex = new dataIndex('primary'); const sortedIndex = new dataIndex('sorted'); for (let i = 0; i < 10; i++) { let newModel = new dataModel(Math.random()); modelIndex.indexModel(newModel); } const ordered = modelIndex.vec.sort((a, b) => dataModel.compareData(a, b)) ordered.forEach(model => sortedIndex.indexModel(model)); console.log(ordered);
Producción:
[ dataModel { data: 0.08420389624353097, lookup: Map(0) { primary: 9, sorted: 0 } }, dataModel { data: 0.1528733550120258, lookup: Map(0) { primary: 7, sorted: 1 } }, dataModel { data: 0.28483626134194595, lookup: Map(0) { primary: 8, sorted: 2 } }, dataModel { data: 0.3257986769682104, lookup: Map(0) { primary: 5, sorted: 3 } }, dataModel { data: 0.3409113857134396, lookup: Map(0) { primary: 3, sorted: 4 } }, dataModel { data: 0.3841968173496322, lookup: Map(0) { primary: 1, sorted: 5 } }, dataModel { data: 0.40414714769598237, lookup: Map(0) { primary: 4, sorted: 6 } }, dataModel { data: 0.5817767975980099, lookup: Map(0) { primary: 0, sorted: 7 } }, dataModel { data: 0.8091360598739015, lookup: Map(0) { primary: 2, sorted: 8 } }, dataModel { data: 0.8217632650897493, lookup: Map(0) { primary: 6, sorted: 9 } } ]