Es interesante que las personas en estas respuestas hayan tocado ambos Object.keys()
y for...of
nunca los hayan combinado:
var map = {well:'hello', there:'!'};
for (let key of Object.keys(map))
console.log(key + ':' + map[key]);
Puede no sólo for...of
una Object
, porque no es un iterador, y for...index
o .forEach()
ing el Object.keys()
es feo / ineficiente.
Me alegra que la mayoría de las personas se abstengan for...in
(con o sin verificación .hasOwnProperty()
), ya que eso también es un poco desordenado, por lo que, aparte de mi respuesta anterior, estoy aquí para decir ...
¡Puedes hacer que las asociaciones de objetos ordinarios se repitan! Comportarse como Map
s con el uso directo de la elegante for...of
DEMO que funciona en Chrome y FF (supongo que 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);
Siempre que incluyas mi cuña a continuación:
//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;
}};
};
Sin tener que crear un objeto Map real que no tenga el agradable azúcar sintáctico.
var trueMap = new Map([['well', 'hello'], ['there', '!']]);
for (let pair of trueMap)
console.log(pair[0] + ':' + pair[1]);
De hecho, con esta cuña, si aún desea aprovechar la otra funcionalidad de Map (sin calzarlas todas) pero aún desea usar la notación de objeto ordenada, ya que los objetos ahora son iterables, ¡ahora puede hacer un Mapa a partir de ella!
//shown in demo
var realMap = new Map({well:'hello', there:'!'});
Para aquellos a quienes no les gusta calzar, o meterse con ellos prototype
en general, siéntanse libres de hacer la función en la ventana, llamándola así 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;
}
Ahora solo puede llamarlo como una función ordinaria, nada más se ve afectado
var realMap = new Map(getObjIterator({well:'hello', there:'!'}))
o
for (let pair of getObjIterator(ordinaryObject))
No hay razón para que eso no funcione.
Bienvenido al futuro.