Це цікаві люди в цих відповідях торкнулися як Object.keys()
і for...of
але ніколи не поєднали їх:
var map = {well:'hello', there:'!'};
for (let key of Object.keys(map))
console.log(key + ':' + map[key]);
Ви не можете просто , тому що це не итератор, і чи ТРАЄКТОРІЇ некрасиво / неефективно.
Я радий, що більшість людей утримуються від (з перевіркою або без неї ), оскільки це теж трохи безладно, тому, крім моєї відповіді вище, я хочу сказати ...for...of
Object
for...index
.forEach()
Object.keys()
for...in
.hasOwnProperty()
Ви можете зробити звичайні об'єктні об'єднання ітераційними! Поводиться так само, як Map
і з прямим використанням фантазійного for...of
DEMO, що працює в Chrome та FF (я припускаю, що лише 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);
До тих пір, поки ви включите мою підкладку нижче:
//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;
}};
};
Без створення справжнього об’єкта Map, який не має приємного синтаксичного цукру.
var trueMap = new Map([['well', 'hello'], ['there', '!']]);
for (let pair of trueMap)
console.log(pair[0] + ':' + pair[1]);
Насправді, з цією мережею, якщо ви все-таки хотіли скористатись іншими функціональними можливостями Map (не переставляючи їх усіх), але все ж хотіли використати акуратні позначення об'єктів, оскільки об’єкти тепер доступні, тепер ви можете просто зробити з нього карту!
//shown in demo
var realMap = new Map({well:'hello', there:'!'});
Для тих, хто не любить скуйовджуватися або prototype
взагалі возитися з ними , не соромтесь замість цього зробити функцію у вікні, називаючи її чимось на зразок 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;
}
Тепер ви можете просто називати це звичайною функцією, більше нічого не впливає
var realMap = new Map(getObjIterator({well:'hello', there:'!'}))
або
for (let pair of getObjIterator(ordinaryObject))
Немає причин, чому це не спрацювало б.
Ласкаво просимо в майбутнє.