Bu cevapları ilginç insanlar hem dokundu var Object.keys()
ve for...of
fakat bunları kombine asla:
var map = {well:'hello', there:'!'};
for (let key of Object.keys(map))
console.log(key + ':' + map[key]);
Sen sadece can for...of
bir Object
bir yineleyici değil çünkü ve for...index
ya .forEach()
ing Object.keys()
çirkin / verimsizdir.
Çoğu insanın for...in
(kontrol ile veya kontrol etmeden .hasOwnProperty()
) kaçındığı için memnunum, çünkü bu da biraz dağınık, bu yüzden yukarıdaki cevabım dışında, söylemek için buradayım ...
Sıradan nesne ilişkilendirmelerini yineleyebilirsiniz! Tıpkı davranmak Map
fantezi doğrudan kullanımı ile s for...of
DEMO Chrome ve FF çalışma (ı ES6 varsayalım için)
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);
Şimimi aşağıya eklediğiniz sürece:
//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;
}};
};
Güzel sözdizimsel şekeri olmayan gerçek bir Harita nesnesi oluşturmak zorunda kalmadan.
var trueMap = new Map([['well', 'hello'], ['there', '!']]);
for (let pair of trueMap)
console.log(pair[0] + ':' + pair[1]);
Aslında, bu şim ile, hala Harita'nın diğer işlevlerinden yararlanmak istiyorsanız (hepsini daraltmadan), ancak yine de düzgün nesne gösterimini kullanmak istediyseniz, nesneler artık yinelenebilir olduğundan, şimdi sadece bir Harita oluşturabilirsiniz!
//shown in demo
var realMap = new Map({well:'hello', there:'!'});
Şim veya prototype
genel olarak karışıklıktan hoşlanmayanlar için , işlevi pencerede yapmaktan çekinmeyin, bunun yerine o getObjIterator()
zamanki gibi bir şey çağırın ;
//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;
}
Şimdi bunu sıradan bir işlev olarak adlandırabilirsiniz, başka hiçbir şey etkilenmez
var realMap = new Map(getObjIterator({well:'hello', there:'!'}))
veya
for (let pair of getObjIterator(ordinaryObject))
Bunun işe yaramamasının bir nedeni yok.
Geleceğe Hoşgeldiniz.