Object.entries()
devuelve una matriz cuyos elementos son matrices correspondientes a los [key, value]
pares de propiedades enumerables que se encuentran directamente sobre object
. El orden de las propiedades es el mismo que el dado al recorrer manualmente los valores de propiedad del objeto.
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/entries#Description
La Object.entries
función devuelve casi el resultado exacto que está solicitando, excepto que las teclas son cadenas en lugar de números.
const obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0};
console.log(Object.entries(obj));
Si necesita que las claves sean números, puede asignar el resultado a una nueva matriz con una función de devolución de llamada que reemplace la clave en cada par con un número forzado.
const obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0};
const toNumericPairs = input => {
const entries = Object.entries(input);
return entries.map(entry => Object.assign(entry, { 0: +entry[0] }));
}
console.log(toNumericPairs(obj));
Utilizo una función de flecha y Object.assign
para la devolución de llamada del mapa en el ejemplo anterior para poder mantenerla en una instrucción aprovechando el hecho de que Object.assign
devuelve el objeto al que se está asignando, y el valor de retorno de una sola función de flecha de instrucción es el resultado de la instrucción.
Esto es equivalente a:
entry => {
entry[0] = +entry[0];
return entry;
}
Como mencionó @TravisClarke en los comentarios, la función de mapa podría acortarse a:
entry => [ +entry[0], entry[1] ]
Sin embargo, eso crearía una nueva matriz para cada par clave-valor, en lugar de modificar la matriz existente en su lugar, duplicando la cantidad de matrices de pares clave-valor creadas. Si bien la matriz de entradas originales aún está accesible, no se recolectarán basura ni sus entradas.
Ahora, aunque el uso de nuestro método in situ todavía utiliza dos matrices que contienen los pares clave-valor (las matrices de entrada y de salida), el número total de matrices solo cambia en uno. Las matrices de entrada y salida en realidad no están llenas de matrices, sino que las referencias a las matrices y esas referencias ocupan una cantidad insignificante de espacio en la memoria.
- La modificación de cada par clave-valor en el lugar da como resultado una cantidad insignificante de crecimiento de memoria, pero requiere escribir algunos caracteres más.
- La creación de una nueva matriz para cada par clave-valor da como resultado la duplicación de la cantidad de memoria requerida, pero requiere escribir algunos caracteres menos.
Puede ir un paso más allá y eliminar el crecimiento por completo modificando la matriz de entradas en el lugar en lugar de asignarla a una nueva matriz:
const obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0};
const toNumericPairs = input => {
const entries = Object.entries(obj);
entries.forEach(entry => entry[0] = +entry[0]);
return entries;
}
console.log(toNumericPairs(obj));
NaN
en su lugar. Si desea usar cadenas como sus claves, cambie el retorno de[Number(key), obj[key]]
a[key, obj[key]]
o useObject.entries
como sugirió @Pila en su respuesta