Object.entries()
restituisce un array i cui elementi sono array corrispondenti alle enumerabili [key, value]
coppie di proprietà trovate direttamente su object
. L'ordinamento delle proprietà è uguale a quello fornito eseguendo il ciclo manualmente sui valori delle proprietà dell'oggetto.
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/entries#Description
La Object.entries
funzione restituisce quasi l'output esatto che stai chiedendo, tranne i tasti sono stringhe anziché numeri.
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));
Se è necessario che i tasti siano numeri, è possibile mappare il risultato su un nuovo array con una funzione di callback che sostituisce il tasto in ciascuna coppia con un numero forzato da esso.
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));
Uso una funzione freccia e Object.assign
per il callback della mappa nell'esempio sopra in modo da poterlo conservare in un'istruzione sfruttando il fatto che Object.assign
restituisce l'oggetto a cui è assegnato, e il valore restituito di una singola istruzione freccia è il risultato dell'istruzione.
Ciò equivale a:
entry => {
entry[0] = +entry[0];
return entry;
}
Come menzionato da @TravisClarke nei commenti, la funzione della mappa potrebbe essere abbreviata in:
entry => [ +entry[0], entry[1] ]
Tuttavia, ciò creerebbe un nuovo array per ciascuna coppia chiave-valore, invece di modificare l'array esistente in atto, raddoppiando quindi la quantità di array di coppie chiave-valore create. Mentre l'array di voci originale è ancora accessibile, esso e le sue voci non verranno raccolte in modo inutile.
Ora, anche se il nostro metodo sul posto utilizza ancora due array che contengono le coppie chiave-valore (array di input e output), il numero totale di array cambia solo di uno. Le matrici di input e output non sono effettivamente piene di matrici, ma piuttosto i riferimenti alle matrici e quei riferimenti occupano una quantità trascurabile di spazio nella memoria.
- La modifica di ogni coppia chiave-valore sul posto comporta una quantità trascurabile di crescita della memoria, ma richiede la digitazione di alcuni caratteri in più.
- La creazione di un nuovo array per ciascuna coppia chiave-valore comporta il raddoppio della quantità di memoria richiesta, ma richiede la digitazione di alcuni caratteri in meno.
È possibile fare un ulteriore passo avanti ed eliminare del tutto la crescita modificando la matrice di voci sul posto anziché mappandola su una nuova matrice:
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
invece. Se si desidera utilizzare stringhe come le chiavi, modificare il ritorno da[Number(key), obj[key]]
a[key, obj[key]]
o utilizzare ilObject.entries
come @Pila suggerito nella loro risposta