在循环中使用对象
为什么不可以使用循环中的对象? 或者这是一个浏览器错误? 这段代码在Chrome 42中不起作用,说undefined不是一个函数:
test = { first: "one"} for(var item of test) { console.log(item) }
for..of循环仅支持像数组这样的可迭代对象,而不支持对象。
要迭代对象的值,请使用:
for (var key in test) { var item = test[key]; }
如果您要将数据存储在键值存储区中, 请使用专门为此devise的Map
。
如果你不得不使用一个对象,ES2017(ES8)允许你使用Object.values
:
const foo = { a: 'foo', z: 'bar', m: 'baz' }; for (let value of Object.values(foo)) { console.log(value); }
如果还不支持,请使用Object.values()
: Object.values()
替代版本
最后,如果您支持不支持此语法的较旧环境,则必须使用forEach
和Object.keys
:
var obj = { a: 'foo', z: 'bar', m: 'baz' }; Object.keys(obj).forEach(function (prop) { var value = obj[prop]; console.log(value); });
你可以使用这个语法:
let myObject = {first: "one"}; for(let [key, value] of Object.entries(myObject)) { console.log(key, value); // "first", "one" }
然而, Object.entries
目前支持不佳。 你可能需要一个polyfill。
我用这个代码创build了可迭代的对象:
Object.prototype[Symbol.iterator] = function*() { for(let key of Object.keys(this)) { yield([ key, this[key] ]) } }
用法:
for(let [ key, value ] of {}) { }
因为对象字面值没有Symbol.iterator属性。 具体来说,只能遍历string , 数组 , 映射 , 集合 , 参数 , NodeList (不广泛支持)和Generator for …循环。
为了处理Object Literal迭代,你有两个select。
对于在…
for(let key in obj){ console.log(obj[key]); }
Object.keys + forEach
Object.keys(obj).forEach(function(key){ console.log(obj[key]); });
迭代器,ECMAScript 2015 / ES6中的Iterable和for..of循环
let tempArray = [1,2,3,4,5]; for(element of tempArray) { console.log(element); } // 1 // 2 // 3 // 4 // 5
但如果我们这样做
let tempObj = {a:1, b:2, c:3}; for(element of tempObj) { console.log(element); } // error
我们得到错误是因为for..of循环只能在Iterables上工作 ,也就是说,具有@@ iterator的对象遵循Iterator协议 ,意味着它必须有一个具有下一个方法的对象。 下一个方法没有参数,它应该返回一个具有这两个属性的对象。
完成 :表示序列在真时结束,而假表示可能有更多的值:这是序列中的当前项目
所以,为了使对象可用,我们可以:
1。通过Symbol.iterator属性赋予它为mystical @@ iterator属性,使对象成为可迭代 对象。以下是:
let tempObj = {a:1, b:2, c:3}; tempObj[Symbol.iterator]= () => ({ next: function next () { return { done: Object.keys(this).length === 0, value: Object.keys().shift() } } }) for(key in tempObj){ console.log(key) } // a // b // c
2.使用Object.entries ,它返回一个Iterable :
let tempObj = {a:1, b:2, c:3}; for(let [key, value] of Object.entries(tempObj)) { console.log(key, value); } // a 1 // b 2 // c 3
3.使用Object.keys ,这里是:
let tempObj = {a:1, b:2, c:3}; for (let key of Object.keys(tempObj)) { console.log(key); } // a // b // c
希望这可以帮助!!!!!!
对象文字没有内置的迭代器,这些迭代器需要for...of
循环。 但是,如果您不想通过将自己的[Symbol.iterator]
添加到对象的麻烦,则可以简单地使用Object.keys()
方法。 这个方法返回一个Array
对象,它已经有了一个内置的迭代器,所以你可以像下面这样使用for...of
循环:
const myObject = { country: "Canada", province: "Quebec", city: "Montreal" } for (let i of Object.keys(myObject)) { console.log("Key:", i, "| Value:", myObject[i]); } //Key: country | Value: Canada //Key: province | Value: Quebec //Key: city | Value: Montreal
答案是否定的。这是不可能使用For..Of与对象文字。
我同意Overv,For..Of仅用于迭代。 我有完全相同的问题,因为我使用对象遍历键和值与for..in。 但是我只是意识到这就是ES6 MAPS和SETS的用途。
let test = new Map(); test.set('first', "one"); test.set('second', "two"); for(var item of test) { console.log(item); // "one" "two" }
因此,它实现了不必使用for..In(使用hasOwnProperty进行validation)而不必使用Object.keys()的目标。
此外,您的密钥不限于string。 您可以使用数字,对象或其他文字。
可以在任何给定对象上定义一个迭代器,这样就可以为每个对象设置不同的逻辑
var x = { a: 1, b: 2, c: 3 } x[Symbol.iterator] = function* (){ yield 1; yield 'foo'; yield 'last' }
然后直接迭代x
for (let i in x){ console.log(i); } //1 //foo //last
可以在Object.prototype
对象上做同样的事情并为所有对象设置一个通用的迭代器
Object.prototype[Symbol.iterator] = function*() { for(let key of Object.keys(this)) { yield key } }
然后像这样迭代你的对象
var t = {a :'foo', b : 'bar'} for(let i of t){ console.log(t[i]); }
或者这样
var it = t[Symbol.iterator](), p; while(p = it.next().value){ console.log(t[p]) }
怎么样使用
function* entries(obj) { for (let key of Object.keys(obj)) { yield [key, obj[key]]; } } for ([key, value] of entries({a: "1", b: "2"})) { console.log(key + " " + value); }
在ES6中,你可以使用generator:
var obj = {1: 'a', 2: 'b'}; function* entries(obj) { for (let key of Object.keys(obj)) { yield [key, obj[key]]; } } let generator = entries(obj); let step1 = generator.next(); let step2 = generator.next(); let step3 = generator.next(); console.log(JSON.stringify(step1)); // {"value":["1","a"],"done":false} console.log(JSON.stringify(step2)); // {"value":["2","b"],"done":false} console.log(JSON.stringify(step3)); // {"done":true}
这是jsfiddle。 在输出中,您将获得一个具有"value"
和"done"
键的对象。 "Value"
包含你想要它的一切, "done"
是在布尔迭代的当前状态。