迭代器模式

2021-10-01 13:31:00 字數 2734 閱讀 2925

順序訪問乙個集合,基本上是陣列形式的,物件不是有序的列表無法順序訪問。使用者無需知道集合的內部結構。

舉例:

>

jqueryp

>

>

jqueryp

>

>

jqueryp

>

let arr =[1

,2,3

];let nodelist = document.

getelementsbytagname

('p');

//是乙個類陣列,但不是陣列

let $p =$(

'p')

;//要遍歷這三個不同資料型別的變數,需要三中遍歷方式

//第一

arr.

foreach

(function

(item)

)//第二

for(

let i =

0; i < nodelist.length; i++

)//第三

$p.each

(function

(key, p)

)

現在寫乙個方法能同時遍歷以上三種資料。

class

iterator

next()

return

null

}hasnext()

return

true;}

}class

container

//生成遍歷器

getiterator()

}let container =

newcontainer([

1,2,

3,4,

5,6]

);let iterator = container.

getiterator()

;while

(iterator.

hasnext()

)// 1

// 2

// 3

// 4

// 5

// 6

以上是自己手寫的乙個迭代器,es6中已經有封裝好的迭代器。

es6中的iterator語法:

es6語法中,有序集合的資料型別(array map set string typedarray argument nodelist)有很多種(注意:object不是有序集合,可以用map代替),這時需要乙個統一的遍歷介面訪問這些有序集合中的資料,es6中的iterator可以做到。

有序集合的資料型別需要有[symbol.iterator]屬性,這個屬性的值是函式,執行這個函式會返回乙個迭代器,這個迭代器有next方法可順序迭代子元素,這是es6中幫我們封裝好的,上面例子中的的next是我們自己寫的。

可執行array.prototype[symbol.iterator]測試。

function

each

(data)

;while

(!item.done)}}

each

(arr)

;each

(nodelist)

;each

($p)

;

但是!!!

symbol.iterator並不是人人都知道的,也不是每個人都需要封裝乙個 each 方法,因此,es6提供了乙個新的方法for...of來遍歷:

function

each

(data)

}each

(arr)

;each

(nodelist)

;each

($p)

;

for...in是用來遍歷物件的,for...of是遍歷迭代器的。

iterator 的價值不限於上述幾個型別的遍歷,還有generator函式的使用。generator返回的資料符合iterator介面遍歷的要求,所以generator函式也可以使用iterator語法。

當然也可以用for…of。

function

*foo()

//當然也可以用for...of

for(

const v of

foo())

// 1

// 2

// 3

// 4

// 5

// 6

迭代器模式

迭代器模式 iterator 提供一種方法順序訪問乙個聚合物件中各個元素,而不是暴露該物件的內部表示。乙個聚集物件,而且不管這些物件是什麼都需要遍歷的時候,你就應該考慮用迭代器模式。你需要對聚集有多種方式遍歷時,可以考慮用迭代器模式。為遍歷不同的聚集結構提供如開始,下乙個,是否結束,當前哪一項等統一...

迭代器模式

我最早接觸的設計模式就是迭代器模式了哈 為什麼要有迭代器模式呢?看下下面的 就知道了哈 對於乙個陣列物件sz 我們要怎麼遍歷呢?public void bianlisz class geweishu public myiterator getiterator private class geweis...

迭代器模式

迭代器模式 提供一種方法順序訪問乙個聚合物件中各個元素,而又不暴露該物件多的內部表示。1 iterator抽象類 public abstract class iterator 2 aggregate聚集抽象類 public abstract class aggregate 3 concreteite...