1. 程式人生 > >關於使用ES6語法實現對物件的迭代

關於使用ES6語法實現對物件的迭代

使用[Symbol.iterator]實現迭代

備註:此處的操作,由於使用的方法是Object.keys(object)的方式獲取到物件的屬性。
所以遍歷所使用的 鍵(keys()),值(values()),和鍵值對(entries())方法,均採用Symbol屬性。

/**
 * 方法名採用Symbol作為屬性唯一識別符號
 * @type {symbol}
 */
let keys = Symbol("keys");
let values = Symbol('values');
let entries = Symbol('entries');
/**
 * 示例操作物件
 * @type
{{name: string, gender: string, age: number, email: string, mobile: string, job: string, skills: string}} */
const person = { name: '張三', gender: '男', age: 23, email: '[email protected]', mobile: '13398754613', job: 'IT', skills: 'piano' } /** * 獲取鍵值 * @returns {*} */
person[keys] = function () { return { self: this, [Symbol.iterator]() { let index = 0; let self = this.self; return { //為迭代器必須函式 next() { let keys = Object.keys(self); return
index < keys.length ? { value: keys[index++], done: false } : {value: undefined, done: true} } } } } } /** * 獲取值 * @returns {*} */ person[values] = function () { return { self: this, [Symbol.iterator]() { let index = 0; let self = this.self; return { next() { let keys = Object.keys(self); return index < keys.length ? { value: self[keys[index++]], done: false } : {value: undefined, done: true} } } } } } /** * 鍵值對獲取方式 * @returns {*} */ person[entries] = function () { return { self: this, [Symbol.iterator]() { let index = 0; let self = this.self; return { next() { let keys = Object.keys(self); return index < keys.length ? { value: [keys[index++], self[keys[index - 1]]], done: false } : {value: undefined, done: true} } } } } } **驗證程式碼** //物件屬性遍歷,其實這個可以用更簡單的方式遍歷出來,採用for...in for (let key of person[keys]()) { console.log(key); // name gender age email mobile job skills } //for-in 遍歷屬性 for (let key in person) { console.log(key); // name gender age email mobile job skills } //物件屬性值遍歷,同理可以採用for-in for (let value of person[values]()) { console.log(value); //張三 男 23 [email protected] 13398754613 IT piano } //採用for-in遍歷同理 for (let key in person) { console.log(person[key]); //張三 男 23 [email protected] 13398754613 IT piano } //物件屬性鍵值對遍歷 for (let [key, value] of person[entries]()) { console.log([key, value]); // ['name', '張三'] // ['gender', '男'] // ['age', 23] // ['email', '[email protected]'] // ['mobile', '13398754613'] // ['job', 'IT'] // ['skills', 'piano'] }

說明:關於兩者的區別,具體應該跟順序有關係,本身物件是無序的,在使用不同瀏覽器執行出來的效果可能順序是不一致的(for-in),這一點在之前接觸的專案中有接觸過。至於for-of 通過迭代器是具有一定順序的遍歷。所以兩者如果是在順序上有嚴格的要求的,建議採用for-of的方式進行遍歷。也就是實現[Symbol.iterator]**

採用Generator實現物件的遍歷
此處採用的示例操作物件依舊是一方式中的person

/**
 * 鍵值對獲取方式
 * @param obj 此處的物件為字面性物件
 */
function* entries(obj) {
    for (let key of Object.keys(obj)) {
        yield [key, obj[key]];
    }
}
/**
 * 鍵獲取方式
 * @param obj 此處的物件為字面性物件
 */

function* keys(obj) {
    for (let key of Object.keys(obj)) {
        yield key;
    }
}
/**
 * 鍵值獲取方式
 * @param obj 此處的物件為字面性物件
 */
function* values(obj) {
    for (let key of Object.keys(obj)) {
        yield obj[key];
    }
}
**測試程式碼**
//鍵值
 for (let [key, value] of entries(person)) {
    console.log([key, value]);
}
//鍵
for (let key of keys(person)) {
    console.log(key);
}
//鍵值
for (let value of values(person)) {
    console.log(value);
}

今日學習成果就展示到這了。如果有志同道合的,有更好的程式碼,歡迎指點與分享。

相關推薦

關於使用ES6語法實現物件

使用[Symbol.iterator]實現迭代 備註:此處的操作,由於使用的方法是Object.keys(object)的方式獲取到物件的屬性。 所以遍歷所使用的 鍵(keys()),值(values()),和鍵值對(entries())方法,均採用Symb

基於模型融合的推薦系統實現(2):式SVD分解

SVD演算法的原理網路上也有很多,不再細說了,關鍵是我們得到的資料是不完整的資料,所以要算SVD就必須做一次矩陣補全。補全的方式有很多,這裡推薦使用均值補全的方法(用每一行均值和每一列均值的平均來代替空白處),然後可以計算SVD,作PCA分析,然後就可以得到預測結果。 但是我們這裡有

面向物件-

建立一個迭代器的類 class Foo: def __init__(self,n): self.n = n def __iter__(self): #將物件變成一個可迭代物件 return self def __next__(self): #迭代器

es6語法淺克隆物件和陣列

廢話不多說直接上演示 1.克隆物件: const json1={"a":"1"}; let jsonnew={...json1}; jsonnew.b="2"; console.log(jsonnew,json1); 2.克隆陣列: const arr1=["1"]; let arr

使用JSON.parse(),JSON.stringify()實現物件的深拷貝

  根據不包含引用物件的普通陣列深拷貝得到啟發,不拷貝引用物件,拷貝一個字串會新闢一個新的儲存地址,這樣就切斷了引用物件的指標聯絡。 測試例子: var test={ a:"ss", b:"dd", c:[ {dd:"css",ee:"c

Python(七)語法 高階特性 切片 | (迴圈)| 列表生成式 | 生成器 |

切片 取一個list或tuple的部分元素是非常常見的操作 有一個list[0,1,2,3,4,5]如果我們要取前n個元素比如說3個數 一般做法是 >>> L=[] >>> n=3 >>> for i in range(n): .

Python物件與反相關問題與解決技巧

  1.如何實現可迭代物件和迭代器物件(1)¶ In [1]: # 列表和字

Python 物件, 器, 生成器

容器 容器是一種把多個元素組織在一起的資料結構, 容器中的元素可以逐個地迭代獲取. 如: list, set, dict, tuple, str 可迭代物件 可以返回一個迭代器的物件. x = [1,2,3] y = iter(x) z = iter(x) x

3. 物件與反相關問題與解決技巧

一. 如何實現可迭代物件和迭代器物件 實際案列 某軟體要求, 從網路抓取各個城市氣溫資訊, 並依次顯示: 北京: 15-20 天津: 17-22 長春: 12-18 ... 如果一次抓取所有城市氣溫再顯示, 顯示第一個城市氣溫時, 有很高

foreach遍歷實現原理_實現(使用foreach)

遍歷陣列或者集合時,之所以使用foreach可以實現,那是因為類中繼承了IEnunerable介面,此介面可以重寫IEnumerator型別的GetEnumerator()方法(此方法即得到一個列舉器),正是因為這個介面(方法)所以foreach才會起到遍歷的作用 上程式碼: namespace

使用元類實現物件的所有方法和屬性進行遍歷

之前嘗試跟著書上的教程寫爬蟲的IP代理池的時候,想要根據爬蟲抓取類(class Crawler)下的所有方法(主要是爬取各代理網站),當時是直接照著書上敲的,不太理解,今天重新看了一下元類的知識點,重新寫了一個實現該方法的模板,具體如下(元類的知識自行學習吧):

C++資料結構——二叉搜尋樹(實現自定義器)

#ifndef BS_Tree_H #define BS_Tree_H #include"node.h"  #include<iostream> #include<queue> using namespace std; template<typename T>class

高次遞迴轉換為方式實現計算效率的影響

遞迴轉換為迭代方式實現對計算效率的影響 什麼是遞迴 一句話解釋遞迴:自己呼叫自己 遞迴(百度百科) eg. define function(x) { if x ... { return ... } else { return function(x...

ES6器與可物件

ES6 新的陣列方法、集合、for-of 迴圈、展開運算子(...)甚至非同步程式設計都依賴於迭代器(Iterator )實現。本文會詳解 ES6 的迭代器與生成器,並進一步挖掘可迭代物件的內部原理與使用方法 一、迭代器的原理 在程式語言中處理陣列或集合時,使用迴圈語句必須要初始化一個變數記錄迭

C# 使用實現自定義類的foreach遍歷

假設我們實現了一個自定義棧, 需要對其從棧頂到棧底遍歷一遍, 找到需要的元素. 我們可以在類內部提供一個迭代器GetEnumerator , 而不必實現整個 IEnumerable介面. 當編譯器檢測到迭代器時, 它將自動生成 IEnumerable 或 I

js相關語法基礎(3)字典(物件) 及遍歷

判斷一個物件中是否含有屬性 即是否含有某個key 可以用 in  但是toString 定義在object物件中,而物件最終都會在原型鏈上指向object,所以 toString存在於每個物件中 這時候可以使用 hasOwnProperty()方法。 var xiaomin

python如何使用生成器函式實現物件

實際案例 實現一個可迭代物件的類,它能迭代出給定範圍內所有素數: pn = PrimeNumbers(1, 30) for k in pn: print k123 輸出結果為: 2 3 5 7 11 13 17 19 23 291 解決方案:將該類的__iter

python-6-如何實現物件物件

python的可迭代物件:list(列表)是可迭代物件,dict(字典)是可迭代物件,string(字串)也是可迭代物件。 l = [1,2,3,4] s = 'abcdef' for x in

巧妙的使用ES6的for...of處理JS物件

寫在前面 我沒事的時候喜歡看一下大牛的部落格和論壇,最近看了張鑫旭大哥關於介紹for...of的部落格,這裡簡單的總結一下,給自己一個記憶理解的過程,同時分享給那些一直關注我喜歡技術的人。鄙人能力有限,寫的不妥,多多指教。 什麼叫做物件? 沒寫之前首先解釋一下什麼叫做“

ES6語法將扁平的JSON象結構化

-1 col for 結構 form表單提交 語法 console ble json 適用於支持ES6語法的項目中。 Form表單提交整個Table的數據,每單個表單必須有唯一的name,當數據量較大時,不可能去手動設置每一個name名。 因此通過遍歷出有規律的name,然