自定义迭代器返回空数组 [英] Custom iterator returns empty array

查看:104
本文介绍了自定义迭代器返回空数组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

为什么结果为空?

  var myDogs = function(dogs){
this.dogs = dogs;
这个[Symbol.iterator] = function(){
let i = -1;
return {
next(){
i ++;
let j = 0;
var dog = void(0);
for(var dog in this.dogs){
if(j == i){
dog = {dog,hungry:dogs [dog]};
break;
}
j ++;
}
var done =!dog;
return {value:dog,done};
}
};
};
};

var dogs = new myDogs({buddy:true,hasso:false});
var dogHungryMap = [... dogs];
> dogHungryMap = [];

似乎我没有把握迭代器的概念,或者我做了一个完全愚蠢的错误。预期的结果是 [{dog:'buddy',hungry:true},{dog:'hasso':hungry:false}]



http://www.es6fiddle.net/ije6visa/

解决方案

您的代码中有两个错误:




  • 这个,在你的下一个函数中,是迭代器,而不是 myDogs


  • dog 既是您的迭代中的关键,结果。在迭代结束时,这意味着 dog 永远不会 undefined 。你应该更加小心你的变量名称的语义。




解决这两个问题给出了这一点: p>

  var myDogs = function(dogs){
this.dogs = dogs;
let _this = this;
这个[Symbol.iterator] = function(){
let i = -1;
return {
next(){
i ++;
let j = 0;
var dog = void(0);
for(var dogName in _this.dogs){
if(j == i){
dog = {dog:dogName,hungry:_this.dogs [dogName]};
break;
}
j ++;
}
var done =!dog;
return {value:dog,done};
}
};
};
};

但是有一个更简单的解决方案:

  var myDogs = function(dogs){
this [Symbol.iterator] = function(){
let i = -1;
return {
next(){
i ++;
var dog = Object.keys(dogs)[i];
if(!dog)return {done:true};
return {value:{dog,hungry:dogs [dog]},done:false};
}
};
};
};

旁注:没有理由使用 void(0)今天。


Why is the result empty?

var myDogs = function(dogs) { 
 this.dogs = dogs;
 this[Symbol.iterator] = function() {
   let i = -1;
   return {    
    next() {
     i++;
     let j = 0;
     var dog = void(0);
     for (var dog in this.dogs) {
       if (j == i) {
        dog = { dog, hungry: dogs[dog] };
        break;
       } 
       j++;
     }
     var done = !dog;
     return { value: dog, done };
    }
   };
 };
};

var dogs = new myDogs({ buddy: true, hasso: false });
var dogHungryMap = [...dogs];
> dogHungryMap = [];

Seems like I haven't grasped the concept of iterators or I am doing a totally stupid mistake. The expected result is [{ dog: 'buddy', hungry: true }, { dog: 'hasso': hungry: false }].

http://www.es6fiddle.net/ije6visa/

解决方案

Two bugs in your code:

  • this, in your next function, is the iterator, not the instance of myDogs.

  • dog is both the key in your iteration and the result. Which means dog is never undefined at the end of the iteration. You should probably be more careful with the semantic of your variable names.

Solving these two problems gives this:

var myDogs = function(dogs) {  
 this.dogs = dogs; 
 let _this = this; 
 this[Symbol.iterator] = function() { 
   let i = -1; 
   return {     
    next() { 
     i++; 
     let j = 0; 
     var dog = void(0); 
     for (var dogName in _this.dogs) { 
       if (j == i) { 
        dog = { dog:dogName, hungry: _this.dogs[dogName] }; 
        break; 
       }  
       j++; 
     } 
     var done = !dog; 
     return { value: dog, done }; 
    } 
   }; 
 }; 
};

But there's a simpler solution:

var myDogs = function(dogs) {
 this[Symbol.iterator] = function() {
   let i = -1;
   return {
    next() {
     i++;
     var dog = Object.keys(dogs)[i];
     if (!dog) return {done:true};
     return {value:{ dog, hungry:dogs[dog] }, done:false};
    }
   };
 };
};

Side note: there's no reason to use void(0) today.

这篇关于自定义迭代器返回空数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆