把一个对象变成可迭代对象的两种方法,使用Symbol.iterator 和生成器Generator

方法一:自定义Symbol.iterator属性

如果对象拥有[Symbol.iterator] 方法,改方法返回一个迭代器对象,就可以称之为可迭代对象,注意迭代器是一个有 next 方法的对象

 步骤如下

  1. 实现一个Symbol.iterator 键
  2. 值是一个函数,函数返回一个迭代器
  3. 迭代器是一个对象,对象里有一个next方法
  4. next 方法按照条件返回 {value, done} 的对象
const obj = {name: 'name value',age: 'age value'
}
// 实现一个Symbol.iterator 键
// 值是一个函数,函数返回一个迭代器
// 迭代器是一个对象,对象里有一个next方法
// next 方法按照条件返回 {value, done} 的对象
obj[Symbol.iterator] = function () {const keys = Object.keys(this)let index = 0return {// 一定要使用箭头函数,要不下面的this 不对next: ()=> {if (index < keys.length) {return {// index++ 使用,这条语句结束后再 +1value: this[keys[index++]],done: false}}return {done: true}}}
}
for (let i of obj) {console.log(i) // 这个打印的是 value的值 ,name value, age value
}
// 显式调用
console.log(obj[Symbol.iterator]().next().value)

方法二:使用生成器

生成器真好用

const obj = {name: 'name value',age: 'age value'
}
// function 和函数名之间加一个星号就是一个生成器函数
function* toIterator(obj) {let keys = Object.keys(obj)for (let key of keys) {// 原理是生成器中// 每调用一次遇到 yield 都会停止,并返回【迭代器对象的状态】// 【迭代器对象的状态】是一个对象,{ value:'xx', done: true/false }// 并将 yield 后面的那个【表达式的值】,作为返回的对象的 value 属性值// 如果没有 yield 就会一直运行到函数结束,直到 return 语句// 并将 return 语句后面的表达式值,作为 value// 如果没有 return 语句,则返回的 value 为 undefinedyield obj[key] // 可以自定义遍历的值,这里是 obj 的 value}
}
// 变成可迭代对象
const newObj = toIterator(obj)
// 使用 for of 遍历
for (let i of newObj) {console.log(i) // name value , age value
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/697147.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 时间格式 YYYY 于yyyy的区别

java formatDate 时间时&#xff0c;经常需要输入格式比如 YYYYMMDD,yyyyMMdd 这两个是有区别的 具体每个参数可以看下面

igolang学习1,dea的golang-1.22.0

参考&#xff1a;使用IDEA配置GO的开发环境备忘录-CSDN博客 1.下载All releases - The Go Programming Language (google.cn) 2.直接next 3.window环境变量配置 4.idea的go插件安装 5.新建go项目找不到jdk解决 https://blog.csdn.net/ouyang111222/article/details/1361657…

代码随想录算法训练营第40天| 343. 整数拆分、96.不同的二叉搜索树

343. 整数拆分 完成 思路&#xff1a; dp数组存放正整数i拆分后的乘积最大值&#xff1b;i可以拆分为j和i-j&#xff0c;也可以是j和dp[i-j]。 代码 class Solution {public int integerBreak(int n) {int[] dp new int[n1];dp[2] 1;// 推导i的拆分乘积最大值for (int i …

【js】无限虚拟列表的原理及实现

什么是虚拟列表 虚拟列表是长列表按需显示思路的一种实现&#xff0c;即虚拟列表是一种根据滚动容器元素的可视区域来渲染长列表数据中某一个部分数据的技术。 简而言之&#xff0c;虚拟列表指的就是「可视区域渲染」的列表。有三个概念需要了解一下&#xff1a; 视口容器元…

【linux】linux查看某个已经启动进程的环境变量及命令行信息 /proc/${pid}/environ cmdline

随便找一个进程 yeqiangyeqiang-MS-7B23:~$ ps aux | grep Vir yeqiang 3538 0.4 0.6 1797056 210332 ? Sl 08:38 0:06 /usr/lib/virtualbox/VirtualBox 查看命令行 yeqiangyeqiang-MS-7B23:~$ strings /proc/3538/cmdline /usr/lib/virtualbox/VirtualBox …

Swift基础知识:17.Swift结构体

在 Swift 中&#xff0c;结构体&#xff08;Structures&#xff09;是一种用来封装一组相关的数据和功能的数据类型。结构体是一种值类型&#xff0c;它在传递和赋值时会被复制&#xff0c;与类&#xff08;Class&#xff09;不同&#xff0c;类是引用类型&#xff0c;它在传递…

python专业版破解激活(超详细)

python专业版破解激活 1.下载pycharm应用程序 这里我使用的版本是pycharm-professional-2023.3.2 下载pycharm程序的连接为&#xff1a; 百度网盘 请输入提取码 提取码为&#xff1a;nym0 2.安装 选择安装路径 下一步 这里全选 下一步 这里直接点击安装就可&#xff0c;其…

Opencv(2)深浅拷贝与基本绘图(c++python

Opencv(2)深浅拷贝与基本绘图 文章目录 Opencv(2)深浅拷贝与基本绘图三、深浅拷贝四、HSV色域(1).意义(2).cvtColor()(3).inRange()(4).适应光线 三、深浅拷贝 浅拷贝是指当图像之间进行赋值时&#xff0c;图像数据并未发生复制&#xff0c;而是两个对象都指向同一块内存块。 …

光伏气象站:实现自动化、高精度的气象监测

型号推荐&#xff1a;云境天合 TH-FGF9】光伏气象站是一种基于光伏技术的气象监测设备&#xff0c;它利用太阳能转化为电能&#xff0c;为气象站提供持续的电力供应&#xff0c;并实现自动化、高精度的气象监测。 光伏气象站的工作原理可以分为以下几个部分&#xff1a; 光伏发…

SpringCloud Nacos安装

1. Nacos的下载&#xff1a;下载的是1.4的版本。 2. Nacos的安装&#xff1a; startup.cmd -m standalone 以单机模式启动Nacos。 登录的账号密码 都是nacos。

Android LruCache源码分析

文章目录 Android LruCache源码分析概述LruCache和LinkedHashMap关系源码分析属性写入数据读取数据删除缓存 Android LruCache源码分析 概述 LruCache&#xff08;Least Recently Used Cache&#xff0c;最近最少使用缓存&#xff09;是 Android 中的一种缓存机制。 根据数据…

MySQL 索引原理以及 SQL 优化

索引 索引&#xff1a;一种有序的存储结构&#xff0c;按照单个或者多个列的值进行排序。索引的目的&#xff1a;提升搜索效率。索引分类&#xff1a; 数据结构 B 树索引&#xff08;映射的是磁盘数据&#xff09;hash 索引&#xff08;快速锁定内存数据&#xff09;全文索引 …

Day13-Linux系统用户管理知识精讲2

Day13-Linux系统用户管理知识精讲2 1. passwd 给用户设置密码2. chpasswd 批量设置密码3. chage 查看和更改密码属性 更改用户密码过期信息4. 用户组相关的命令了解 1. passwd 给用户设置密码 用户自己给自己设置密码直接passwd root用户给普通用户设置密码passwd 用户名。 …

ChatGPT调教指南 | 咒语指南 | Prompts提示词教程(一)

在我们开始探索人工智能的世界时&#xff0c;了解如何与之有效沉浸交流是至关重要的。想象一下&#xff0c;你手中有一把钥匙&#xff0c;可以解锁与OpenAI的GPT模型沟通的无限可能。这把钥匙就是——正确的提示词&#xff08;prompts&#xff09;。无论你是AI领域的新手&#…

JS 笔记 --持续更新

this 指向调用 this 是执行上下文中的一个属性&#xff0c;它指向最后一次调用这个方法的对象。 Function.apply(obj,args)方法能接收两个参数 obj&#xff1a;这个对象将代替Function类里this对象 args&#xff1a;这个是数组&#xff0c;它将作为参数传给Function&#xff08…

SpringCloud全家桶---常用微服务组件(1)

注册中心: *作用: 服务管理 Eureka(不推荐)[读音: 优瑞卡] Nacos(推荐) Zookeeper [读音: 如k波] Consul [读音:康寿] **注册中心的核心功能原理(nacos)** 服务注册: 当服务启动时,会通过rest接口请求的方式向Nacos注册自己的服务 服务心跳: NacosClient 会维护一个定时心跳持…

Sora背后的论文(1):使用 lstms 对视频展现进行无监督学习

之前那篇《Sora背后的32篇论文》发出后&#xff0c;大家都觉得不错&#xff0c;有很多小伙伴都开始啃论文了。 那么我就趁热打铁&#xff0c;把这32篇论文的通俗解读版贴一下。 从去年开始&#xff0c;我基本上形成了一个思维方式&#xff0c;任何事情做之前先看看 有没有好的…

个人博客系列-环境配置-gitee(2)

注册gitee账户 地址&#xff1a;https://gitee.com/ 此步骤省略 新建仓库 执行以下命令 即可 拉取代码 创建目录 mkdir myCode && cd myCode 登录gitee找到项目&#xff0c;点击克隆&#xff0c;拉取代码 连接远程仓库命令 git remote add origin 仓库地址http…

MariaDB落幕和思考

听过MySQL的基本也都知道 MariaDB。MariaDB由MySQL的创始人主导开发&#xff0c;他早前曾以10亿美元的价格&#xff0c;将自己创建的公司MySQL AB卖给了SUN&#xff0c;此后&#xff0c;随着SUN被甲骨文收购&#xff0c;MySQL的所有权也落入Oracle的手中。传闻MySQL的创始人担心…

创建型设计模式 - 原型设计模式 - JAVA

原型设计模式 一 .简介二. 案例三. 补充知识 前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子都在歌唱 一 .简介 原型模式提供了一种机制&#xff0c;可以将原始对象复制到新对象&#xff0…