È interessante che le persone in queste risposte abbiano toccato entrambi Object.keys()
e for...of
non li abbiano mai combinati:
var map = {well:'hello', there:'!'};
for (let key of Object.keys(map))
console.log(key + ':' + map[key]);
Non si può solo for...of
una Object
perché non è un iteratore, e for...index
o .forEach()
ing l' Object.keys()
è brutto / inefficiente.
Sono contento che la maggior parte delle persone si stia trattenendo for...in
(con o senza controllo .hasOwnProperty()
) dato che è anche un po 'disordinato, quindi a parte la mia risposta sopra, sono qui per dire ...
Puoi far iterare le associazioni di oggetti ordinari! Comportarsi come una Map
s con l'uso diretto della fantastica for...of
DEMO che funziona in Chrome e FF (presumo solo ES6)
var ordinaryObject = {well:'hello', there:'!'};
for (let pair of ordinaryObject)
//key:value
console.log(pair[0] + ':' + pair[1]);
//or
for (let [key, value] of ordinaryObject)
console.log(key + ':' + value);
Finché includi il mio spessore di seguito:
//makes all objects iterable just like Maps!!! YAY
//iterates over Object.keys() (which already ignores prototype chain for us)
Object.prototype[Symbol.iterator] = function() {
var keys = Object.keys(this)[Symbol.iterator]();
var obj = this;
var output;
return {next:function() {
if (!(output = keys.next()).done)
output.value = [output.value, obj[output.value]];
return output;
}};
};
Senza dover creare un vero oggetto Map che non abbia il simpatico zucchero sintattico.
var trueMap = new Map([['well', 'hello'], ['there', '!']]);
for (let pair of trueMap)
console.log(pair[0] + ':' + pair[1]);
In effetti, con questo spessore, se volevi ancora sfruttare le altre funzionalità di Map (senza metterle tutte in risalto) ma volevi comunque usare la notazione dell'oggetto ordinata, dal momento che gli oggetti sono ora iterabili, ora puoi semplicemente creare una Mappa da esso!
//shown in demo
var realMap = new Map({well:'hello', there:'!'});
Per coloro a cui non piace lo shim o il pasticcio prototype
in generale, sentitevi liberi di rendere la funzione sulla finestra invece, chiamandola così getObjIterator()
;
//no prototype manipulation
function getObjIterator(obj) {
//create a dummy object instead of adding functionality to all objects
var iterator = new Object();
//give it what the shim does but as its own local property
iterator[Symbol.iterator] = function() {
var keys = Object.keys(obj)[Symbol.iterator]();
var output;
return {next:function() {
if (!(output = keys.next()).done)
output.value = [output.value, obj[output.value]];
return output;
}};
};
return iterator;
}
Ora puoi semplicemente chiamarlo come una normale funzione, nient'altro è interessato
var realMap = new Map(getObjIterator({well:'hello', there:'!'}))
o
for (let pair of getObjIterator(ordinaryObject))
Non c'è motivo per cui ciò non funzioni.
Benvenuti nel futuro