我想了解Ecmascript 6迭代器,並試圖創建一個行爲非常像本地數組的數據結構。瞭解實現自定義迭代器
for (let i of [1,2,3]) console.log(i); //Iterate over data set itself
將輸出1,2,3
for (let i of [1,2,3].keys()) console.log(i); //Iterate over a custom iterator from a method
將輸出0,1,2
,和
var a = [1,2,3];
var keys = [...a.keys()];
將包含[0,1,2]
如預期。
因此,
console.log([1,2,3].keys().next());
將輸出Object {value: 0, done: false}
現在,我創建了一個新的數據類型,並試圖使其行爲方式相同。
var myDogs = function(dogs) {
this.dogs = dogs;
this[Symbol.iterator] =() => {
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};
}
};
};
this.dogsNames =() => {
return {
[Symbol.iterator]() {
let i = -1;
return {
next() {
i++;
var dog = Object.keys(dogs)[i];
if (!dog) return {done:true};
return {value: dog, done:false};
}
};
}
}
}
};
var dogs = new myDogs({ buddy: true, hasso: false });
可正常工作(自定義迭代器 - thank you):
var dogHungryMap = [...dogs];
dogHungryMap == [{ dog: 'buddy', hungry: true }, { dog: 'hasso': hungry: false }]
dogsNames()
工作幾乎如預期的迭代器。這是OK:
var names = [...dogs.dogsNames()];
names == ["buddy", "hasso"]
但這並不:
dogs.dogsNames().next()
VM19728:2 Uncaught TypeError: dogs.dogsNames(...).next is not a function(…)
爲什麼,我怎麼能重現本地陣列的行爲?
僅供參考,本地陣列工作方式相同。沒有'Array.prototype.next()'方法,它只能通過'arrayVar [Symbol.iterator]()獲得。next()'too – CodingIntrigue
'dogNames'必須返回一個也是可迭代的迭代器(並返回它自己)。每個內置的迭代器都會這樣做:http://www.ecma-international.org/ecma-262/6.0/index.html#sec-%iteratorprototype%-object。快速測試:v'ar it = [] .keys();它[Symbol.iterator]()===它的結果是'true'。所以基本上:'return {next(){...},[Symbol.iterator](){return this; }};'。 –
@FelixKling這確實回答了我的問題。謝謝。 –