To ciekawe, ludzie w tych odpowiedziach dotknął zarówno Object.keys()a for...ofjednak 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...ofObjectfor...index.forEach()Object.keys()
for...in.hasOwnProperty()
Możesz iterować zwykłe powiązania obiektów! Zachowując się jak Maps 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 prototypew 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.