在循环中使用对象

为什么不可以使用循环中的对象? 或者这是一个浏览器错误? 这段代码在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()替代版本

    最后,如果您支持不支持此语法的较旧环境,则必须使用forEachObject.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"是在布尔迭代的当前状态。