En Map() con objetos como claves, ¿hay alguna forma de reemplazar/actualizar una clave sin perder el orden de las entradas y, si es posible, sin recrear el mapa completo?
Aquí están mis 3 métodos que probé, el objetivo es reemplazar obj2 en el map con obj4 , manteniendo el orden original:
const map = new Map(), obj1 = ["o1"], obj2 = ["o2"], obj3 = ["o3"], obj4 = ["o4"]; map.set(obj1, 1); map.set(obj2, 2); map.set(obj3, 3); console.log("original: " + [...map], "expected result: o1,1,o4,2,o3,3"); console.log("1. simple replace object - doesn't work: " + [...func1(new Map(map), obj4, obj2)]); console.log("2. add new and delete old - incorrect order: " + [...func2(new Map(map), obj4, obj2)]); console.log("3. recreate entire map - correct: " + [...func3(new Map(map), obj4, obj2)]); //#1 simple replace object function func1(map, _new, _old) { let obj = map.get(_old); obj = _new; //doesn't work, because it replaces data in a variable, not in the map itself return map; } //#2 add new and delete old function func2(map, _new, _old) { map.set(_new, map.get(_old)); map.delete(_old) return map; } //#3 recreate entire map function func3 (map, _new, _old) { for(let i = 0, update, entries = [...map]; i < entries.length; i++) { if (!update && entries[i][0] != _old) continue; map.delete(entries[i][0]); map.set(update ? entries[i][0] : _new, entries[i][1]); update = true; } return map; }El n. ° 3 funciona, pero ¿tal vez haya una forma más eficiente?
No, las claves de mapa siempre se iteran en orden de inserción. Si agrega una nueva clave, se agregará al final.
Lo único en lo que puedo pensar sería, si conoce la forma de los objetos nuevos y antiguos, y no tienen prototipos diferentes (por ejemplo, uno es una matriz y el otro es un objeto) es mutar el existente objeto.
const map = new Map(), obj1 = ["o1"], obj2 = ["o2"], obj3 = ["o3"], obj4 = ["o4"]; map.set(obj1, 1); map.set(obj2, 2); map.set(obj3, 3); console.log("original: " + [...map], "expected result: o1,1,o4,2,o3,3"); console.log("mutate object: " + [...func1(new Map(map), obj4, obj2)]); function func1(map, newKey, oldKey) { oldKey.length = 0; oldKey.push(...newKey); return map; }(solo con fines informativos; no recomendaría esto al escribir código serio y fácil de entender)