有趣的是,这些答案中的人都提到了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()),因为这也有点混乱,所以除了我上面的回答之外,我在这里说...
你可以让普通的对象关联迭代!行为就像 Maps,直接使用花哨的 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]);
事实上,有了这个 shim,如果你仍然想利用 Map 的其他功能(而不是全部填充)但仍然想使用整洁的对象表示法,因为对象现在是可迭代的,你现在可以制作一个 Map从它!
//shown in demo
var realMap = new Map({well:'hello', there:'!'});
对于那些不喜欢 shim 或一般不喜欢 prototype 的人,请随意在 window 上创建该功能,然后将其称为 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))
There's no reason why that wouldn't work.
欢迎来到未来。