Justo estaba pensando en la siguiente situación:
Digamos que tenemos una definición de línea como la que se muestra a continuación. Aquí el comienzo y el final son ambos puntos.
let line = { start: {x:0, y:0}, end: {x:0,y:0}, orientation: 'vertical' } Ahora imagine que tenemos una gran variedad de líneas, ¿cómo ahorramos espacio? Sé que puede reemplazar el valor de orientación 'vertical' con un Enum. Pero, ¿puede ahorrar espacio en los nombres clave sin reducir la legibilidad? Por ejemplo, puede reemplazar la orientation con o , pero ahora ya no está claro qué significa la clave.
¡Hágamelo saber!
Si se refiere al uso de la memoria, los motores Javascript son muy inteligentes en estos días, cosas como el uso de búsquedas de claves internas, la desduplicación de cadenas, etc., hacen que tener nombres de claves cortos o largos tenga muy poco efecto.
Por ejemplo, usando su estructura de datos anterior, introduje 1 millón de registros en una matriz, uno con nombres de clave muy largos y otro con nombres de clave de 1 carácter. En ambos casos, el uso de memoria por elementos resultó en unos 147 bytes. Además, incluso usar una const para la vertical tuvo poco efecto.
Pero como puede ver, 147 bytes parece alto, por lo que si quisiera reducir esto, necesitaría usar TypedArrays, desafortunadamente, estos pueden ser un poco más difíciles de razonar. Pero si la memoria fuera una preocupación, podría valer la pena el esfuerzo.
Si usó TypedArray, podría usar getters y setters para hacer esto mucho más fácil. Y al hacer esto, tal vez podría usar 33 bytes por registro, 4 dobles y 1 byte.
Pero antes de hacer nada, primero me aseguraría de que sea necesario hacer este tipo de optimización. La optimización previa de Javascript es una tontería.
PD. Hice las pruebas de memoria usando NodeJs, que básicamente usa el motor Javascript de Chrome.
Además, si desea jugar con la forma en que se afecta la memoria y tiene NodeJs instalado, aquí hay un código de ejemplo para comenzar.
const oused = process.memoryUsage().heapUsed; const values = []; for (let l = 0; l < 1000000; l += 1) { values.push({ start: { x: 0, y: 0 }, end: { x: 0, y: 0 }, orientation: "vertical", }); } console.log(process.memoryUsage().heapUsed - oused);Aquí hay una representación de una línea que logra un equilibrio entre la usabilidad y la eficiencia de la memoria. No utiliza identificadores de cadena porque las posiciones de los datos están codificadas en el tipo. También usa matrices estándar porque no especificó el tamaño del plano de coordenadas cartesianas (por lo que no puedo sugerir un contenedor delimitado como TypedArray):
type Point = [x: number, y: number]; type Line = [a: Point, b: Point]; const line: Line = [[0, 0], [0, 2]]; // More memory efficient: 2 fewer arrays per line: type CompactLine = [...a: Point, ...b: Point]; const compactLine: CompactLine = [0, 0, 0, 2];Le sugiero que cree un mapa para todas las versiones abreviadas de las claves y use el mapa en paralelo con su objeto. El mapa puede tener las claves de objeto como las claves del mapa y la forma completa como los valores
const map = new Map() const object = { o: 4 } // o means orientation map.set("o", "orientation") const mapKeys = Array.from(map.keys()) const redeableObj = {} mapKeys.forEach(key => { const redeableKey = map.get(key) redeableObj[redeableKey] = object[key] }) console.log(object) console.log(redeableObj)