To ciekawe, ludzie w tych odpowiedziach dotknął zarówno Object.keys()
a for...of
jednak nigdy ich łączy:
var map = {well:'hello', there:'!'};
for (let key of Object.keys(map))
console.log(key + ':' + map[key]);
Nie można po prostu ponieważ nie jest iterator i czy ing jest brzydki / nieefektywne.
Cieszę się, że większość ludzi powstrzymuje się od (z lub bez sprawdzania ), ponieważ jest to również trochę niechlujne, więc poza moją odpowiedzią powyżej, jestem tutaj, aby powiedzieć ...for...of
Object
for...index
.forEach()
Object.keys()
for...in
.hasOwnProperty()
Możesz iterować zwykłe powiązania obiektów! Zachowując się jak Map
s przy bezpośrednim użyciu fantazyjnego for...of
DEMO działającego w Chrome i FF (zakładam tylko 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);
Tak długo, jak podasz mój podkładkę poniżej:
//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;
}};
};
Bez konieczności tworzenia prawdziwego obiektu mapy, który nie ma miłego cukru syntaktycznego.
var trueMap = new Map([['well', 'hello'], ['there', '!']]);
for (let pair of trueMap)
console.log(pair[0] + ':' + pair[1]);
W rzeczywistości przy tym podkładce dystansowej, jeśli nadal chciałbyś skorzystać z innej funkcjonalności Mapy (bez odgradzania ich wszystkich), ale nadal chciałeś używać schludnej notacji obiektowej, ponieważ obiekty są teraz iterowalne, możesz teraz po prostu stworzyć z nich Mapę!
//shown in demo
var realMap = new Map({well:'hello', there:'!'});
Dla tych, którzy nie lubią się bawić, lub prototype
w ogóle nie zadzierać , możesz zamiast tego ustawić funkcję okna, nazywając to tak jak getObjIterator()
wtedy;
//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;
}
Teraz możesz po prostu wywołać to jako zwykłą funkcję, nic więcej nie ma wpływu
var realMap = new Map(getObjIterator({well:'hello', there:'!'}))
lub
for (let pair of getObjIterator(ordinaryObject))
Nie ma powodu, dla którego to by nie działało.
Witamy w przyszłości.