Quiero convertir una matriz de matrices en un objeto con el mismo tipo en javascript. Mi problema es que las claves están en números y acabo de ordenar los valores como quiero, pero cuando convierto la matriz en objeto usando reducirlo, clasifíquelo nuevamente por claves.
const names = { 1: 'ياسر', 3: 'احمد' } const sorting = Object.entries(names) .sort((a, b) => a[1].localeCompare(b[1], "ar", { ignorePunctuation: true })) .reduce((acc, x) { acc[x[0]] = x[1]; return acc; }, {});Los objetos no conservan el orden de inserción cuando las claves se analizan como enteros. Por lo tanto, solo puede agregar una cadena a las teclas o usar Map en su lugar.
const names = { 3: 'D', 7: 'A', 5: 'B', 8: 'C' } names["4"] = "E"; console.log("names", names); const object = Object.entries(names) .sort((a, b) => a[1].localeCompare(b[1], "ar", { ignorePunctuation: true })) .reduce((acc, x) => { acc[x[0]] = x[1]; return acc; }, {}); console.log("as object", object); const objectString = Object.entries(names) .sort((a, b) => a[1].localeCompare(b[1], "ar", { ignorePunctuation: true })) .reduce((acc, x) => { acc["_" + x[0]] = x[1]; return acc; }, {}); console.log("as object w/string", objectString); const map = Object.entries(names) .sort((a, b) => a[1].localeCompare(b[1], "ar", { ignorePunctuation: true })) .reduce((acc, x) => { acc.set(x[0], x[1]); return acc; }, new Map()); console.log("as map", map, "look in devtools");[EDITAR] Hay una forma de utilizar el proxy, que permitirá "ocultar" el prefijo de las claves:
const names = { 3: 'D', 7: 'A', 5: 'B', 8: 'C' } names["4"] = "E"; console.log("names", names); function sortObject(obj) { const prefix = "___"; return new Proxy( /* proxy target */ Object.entries(obj) .sort((a, b) => a[1].localeCompare(b[1], "ar", { ignorePunctuation: true })) .reduce((acc, x) => (acc[prefix + x[0]] = x[1], acc), {}) , { /* proxy handler */ get(target, key) { return typeof key == "string" ? target[prefix + key] : target[key]; }, set(target, key, value) { target[prefix + key] = value; }, ownKeys: target => Object.keys(target).map(e => e.substring(prefix.length)), //remove prefix getOwnPropertyDescriptor: (target, key) => ({ enumerable: true, configurable: true }) }); } let proxy = sortObject(names); proxy[0] = "AA"; //new properties added to the end console.log("proxy added new entry to the end", proxy); proxy = sortObject(proxy); //we can sort it again console.log("proxy sorted with new entry", proxy); console.log("it's enumerable too!"); for(i in proxy) console.log("key:", i, "value:", proxy[i]);