把一個對象變成可迭代對象的兩種方法,使用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.pswp.cn/news/697147.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/697147.shtml
英文地址,請注明出處:http://en.pswp.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…