如何把一个对象变成可迭代对象?

简介: 如何把一个对象变成可迭代对象?

可迭代对象(Iterable object)是数组的泛化,这个概念是在说任何对象都可以被定制为可在 for…of 循环中使用的对象。

也就是说,可以应用 for…of 的对象被称为 可迭代对象。

迭代器

在 JavaScript 中,迭代器是一个对象,它定义一个序列,并在终止时可能返回一个返回值。


更具体地说,迭代器是通过使用 next() 方法实现Iterator protocol的任何一个对象,该方法返回具有两个属性的对象:


value,这是序列中的 next 值

done,如果已经迭代到序列中的最后一个值,则它为 true

如果 value 和 done 一起存在,则它是迭代器的返回值。

一旦创建,迭代器对象可以通过重复调用 next() 显式地迭代。


迭代一个迭代器被称为消耗了这个迭代器,因为它通常只能执行一次。


在产生终止值之后,对 next() 的额外调用应该继续返回 {done: true}。


Javascript 中最常见的迭代器是 Array 迭代器,它只是按顺序返回关联数组中的每个值。


虽然很容易想象所有迭代器都可以表示为数组,但事实并非如此。数组必须完整分配,但迭代器仅在必要时使用,因此可以表示无限大小的序列,例如 0 和无穷大之间的整数范围。


这是一个可以做到这一点的例子。它允许创建一个简单的范围迭代器,它定义了从开始(包括)到结束(独占)间隔步长的整数序列。它的最终返回值是它创建的序列的大小,由变量 iterationCount 跟踪。

let index = 0
const bears = ['ice', 'panda', 'grizzly']
let iterator = {
  next() {
    if (index < bears.length) {
      return { done: false, value: bears[index++] }
    }
    return { done: true, value: undefined }
  }
}
console.log(iterator.next()) //{ done: false, value: 'ice' }
console.log(iterator.next()) //{ done: false, value: 'panda' }
console.log(iterator.next()) //{ done: false, value: 'grizzly' }
console.log(iterator.next()) //{ done: true, value: undefined }

实现可迭代对象

如果一个对象拥有 [Symbol.iterator] 方法,并且该方法返回一个迭代器对象,这样的对象即可称为可迭代对象

let info = {
  bears: ['ice', 'panda', 'grizzly'],
  [Symbol.iterator]: function() {
    let index = 0
    let _iterator = {
       //这里一定要箭头函数,或者手动保存上层作用域的this
       next: () => {
        if (index < this.bears.length) {
          return { done: false, value: this.bears[index++] }
        }
        return { done: true, value: undefined }
      }
    }
    return _iterator
  }
}
let iter = info[Symbol.iterator]()
console.log(iter.next())
console.log(iter.next())
console.log(iter.next())
console.log(iter.next())
//符合可迭代对象协议 就可以利用 for of 遍历
for (let bear of info) {
  console.log(bear)
}
//ice panda grizzly
相关文章
|
JSON JavaScript 前端开发
axios的post请求,数据为什么要用qs处理?什么时候不用?
axios的post请求,数据为什么要用qs处理?什么时候不用?
|
11月前
|
前端开发 关系型数据库 MySQL
PHP外链网盘系统网站源码
> 本文将详细介绍如何从零构建一个基于PHP和MySQL的文件管理系统,分解项目代码并剖析每个模块的功能。我们将以`index.php`、`config.php`和`api.php`这三个核心文件为例,详细展示如何设计文件列表、数据库配置和文件上传接口,从而实现一个完整的文件管理系统。该文章可以作为学术研究和代码实现的参考。
482 98
|
JavaScript 前端开发 编译器
ES6 代码转成 ES5 代码的实现思路是什么
ES6 代码转成 ES5 代码的实现思路主要是通过编译器将新的语法结构和特性转换为旧版本的 JavaScript 代码,以确保在不支持 ES6 的环境中可以正常运行。常用的工具如 Babel 可以自动完成这一过程。
|
JavaScript API 索引
js中的reduce()方法 讲解 和实现
`reduce()` 方法对数组元素依次应用一个回调函数,将结果累计并最终返回单一值。语法为 `reduce(callback(accumulator, currentValue, currentIndex, array), initialValue)`。参数包括累计器(初次为初始值或首元素)、当前元素值、索引及数组自身。此方法需返回值供下一轮迭代使用。常见应用场景包括计算数组总和与平均值、统计元素频率、过滤与转换数组内容及去除重复项等。例如,可通过 `reduce()` 快速计算 `[1, 2, 3, 4, 5]` 的总和或对对象属性值求和。此外,还可自定义实现 `reduce()` 方法
5402 1
|
存储 JavaScript 前端开发
双向绑定和 vuex 是否冲突
双向绑定与Vuex在Vue.js中可以共存但需谨慎处理。双向绑定适用于组件内的简单状态管理,而Vuex用于管理应用的全局状态。两者结合使用时,应避免直接在组件中修改Vuex状态,以保持数据流的清晰和可预测性。
|
8月前
|
算法 JavaScript 前端开发
Javascript常见算法详解
本文介绍了几种常见的JavaScript算法,包括排序、搜索、递归和图算法。每种算法都提供了详细的代码示例和解释。通过理解这些算法,你可以在实际项目中有效地解决各种数据处理和分析问题。
323 21
|
安全 API 数据处理
鸿蒙next版开发:ArkTS组件通用属性(隐私遮罩)
在HarmonyOS 5.0中,ArkTS引入了隐私遮罩功能,用于保护用户隐私和数据安全。本文详细介绍了隐私遮罩的通用属性和使用方法,并提供了示例代码。隐私遮罩支持Image和Text组件,在数据加载或处理过程中防止敏感信息泄露,提升用户体验和数据安全性。
437 11
|
监控 JavaScript 开发者
在 Vue 中,子组件为何不可以修改父组件传递的 Prop,如果修改了,Vue 是如何监控到属性的修改并给出警告的
在 Vue 中,子组件不能直接修改父组件传递的 Prop,以确保数据流的单向性和可预测性。如果子组件尝试修改 Prop,Vue 会通过响应式系统检测到这一变化,并在控制台发出警告,提示开发者避免这种操作。
|
JavaScript 索引
vue 在 v-for 时给每项元素绑定事件
在 Vue 中使用 v-for 渲染列表时,可以通过给每项元素绑定事件来实现交互功能。通常使用 `@click` 等事件修饰符,结合方法或内联表达式来处理事件。例如:`&lt;li v-for=&quot;item in items&quot; @click=&quot;handleClick(item)&quot;&gt;{{ item }}&lt;/li&gt;`。
|
JavaScript 前端开发
鸿蒙 NEXT 如何使用 @Styles 装饰器来优化我的组件代码?
【10月更文挑战第16天】在鸿蒙 NEXT 中,`@Styles` 装饰器用于优化组件的样式定义,使代码更清晰和易于维护。通过将样式属性封装到独立对象中,避免了冗长的内联样式,提高了代码的可读性和可维护性。使用步骤包括定义样式对象、在组件中引入并应用装饰器,支持多个样式对象的组合和动态应用。注意样式对象的属性名需与组件支持的样式属性一致,且后定义的样式会覆盖前者的同名属性。
400 0