ES6 中的 Iterator 遍历及解决多元素遍历的问题

阅读时长 6 分钟读完

随着 ES6 的发布,JavaScript 中引入了一种新的遍历方法——Iterator。Iterator 是一种统一的遍历机制,它可以遍历集合中的元素,包括数组、对象、Set、Map 等,在遍历过程中可以获取到每个元素的值以及对应的键。本文将介绍 Iterator 的基本用法和解决多元素遍历的问题。

Iterator 的基本用法

在 ES6 中,Iterator 通过迭代器(Iterator)来实现对集合的遍历。下面是 Iterator 的基本语法:

-- -------------------- ---- -------
-- ----
--- --- - --- -- ---
--- ---- - -----------------------
------------------------- -- - ------ -- ----- ----- -
------------------------- -- - ------ -- ----- ----- -
------------------------- -- - ------ -- ----- ----- -
------------------------- -- - ------ ---------- ----- ---- -

-- ----
--- --- - - ---- ------ ---- ----- --
--- ---- - -----------------------
------------------------- -- - ------ ------- ------- ----- ----- -
------------------------- -- - ------ ------- ------- ----- ----- -
------------------------- -- - ------ ---------- ----- ---- -

通过 arr[Symbol.iterator]()obj[Symbol.iterator]() 方法获取到一个迭代器对象(Iterator),然后可以使用 next() 方法依次遍历集合中的元素,每次调用 next() 方法,都会返回一个包含当前元素的值和是否遍历完毕的状态对象 { value: currentValue, done: false/true }

需要注意的是,当遍历完集合中所有元素之后,再次调用 next() 方法会返回一个 done 属性为 true 的状态对象,同时该对象的 value 属性值为 undefined

解决多元素遍历的问题

在实际开发中,有时候需要同时遍历多个集合中的元素,那么该如何解决多元素遍历的问题呢?下面我们就来介绍两种解决多元素遍历的方法。

zip 方法

zip 方法可以将多个集合中相同位置的元素组合在一起,以数组的形式返回。下面是 zip 方法的示例代码:

-- -------------------- ---- -------
-------- ------------ -
  ------ -----------
    -------- -- ----------------------
    --- ---- -- ------------ -- ---------
  --
-

--- ---- - --- -- ---
--- ---- - ----- ---- -----
--- ---- - ----- ---- -----

--- ---- --- -- -- -- --------- ----- ------ -
  -------------- -- ---
-

-- ----
-- - --- ---
-- - --- ---
-- - --- ---

在上面的示例代码中,我们定义了一个 zip 函数,该函数的参数是多个可迭代对象,我们首先以第一个可迭代对象的长度为基准,使用 Array.from 方法生成一个以 undefined 为值的新数组(长度和第一个可迭代对象一致),然后遍历这个新数组中的每个元素,使用 map 方法将每个元素对应位置的值组合在一起,最终返回一个新的数组。

在使用 zip 函数遍历多个可迭代对象时,我们可以使用 for ... of 循环,同时使用解构赋值获取到每个可迭代对象中对应位置的值,从而实现多个集合的可同时遍历。

生成器函数

相较于 zip 方法,生成器函数更加灵活,可以更加自定义化地定义多元素遍历的方式。下面是生成器函数的示例代码:

-- -------------------- ---- -------
--------- ------------ -
  --- --------- - ------------ -- ------------------------
  ----- ------ -
    --- ------- - ------------------ -- -------------
    -- -------------------- -- ------------- -
      -------
    -
    ----- ------------------ -- --------------
  -
-

--- ---- - --- -- ---
--- ---- - ----- ---- -----
--- ---- - ----- ---- -----

--- ---- --- -- -- -- --------- ----- ------ -
  -------------- -- ---
-

-- ----
-- - --- ---
-- - --- ---
-- - --- ---

在上面的示例代码中,我们定义了一个 zip 生成器函数,该函数的参数是多个可迭代对象。在函数体内,我们首先获取到每个可迭代对象的迭代器,然后使用 while (true) {} 循环逐个遍历每个迭代器的元素。当每个迭代器的 next() 方法返回的状态对象中的 done 属性均为 true 时,退出循环,函数执行完毕。

值得注意的是,在遍历过程中,我们使用 results.some(result => result.done) 语句判断是否所有迭代器均已遍历完毕。当某个迭代器的状态对象中的 done 属性为 true 时,说明该迭代器遍历完毕,这时我们需要退出整个循环。

当所有迭代器均未遍历完毕时,则使用 yield 语句返回一个组合了所有迭代器的当前元素的值的数组。在使用 for ... of 循环遍历生成器函数时,我们可以使用解构赋值获取到每个可迭代对象中对应位置的值,从而实现多个集合的可同时遍历。

总结

通过本文的介绍,我们学习了 Iterator 的基本用法和解决多元素遍历的问题。在实际开发中,Iterator 是一种非常实用的库,它用于遍历集合中的元素,能够极大地提高开发效率和代码可读性。在使用 Iterator 的过程中,我们需要注意遍历完所有元素之后再次调用 next() 方法会返回一个 done 属性为 true 的状态对象,同时该对象的值为 undefined;同时,我们还介绍了两种解决多元素遍历的方法——zip 方法和生成器函数。希望对读者们有所帮助。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6517dc5495b1f8cacd002e04

纠错
反馈