Js中的Object.entries()基本知識詳細(xì)分析(附Demo)
1. 基本知識
用于將對象的可枚舉屬性轉(zhuǎn)換為一個(gè)數(shù)組
該數(shù)組包含對象自身的可枚舉屬性的鍵值對數(shù)組,每個(gè)鍵值對數(shù)組由兩個(gè)元素組成:
- 第一個(gè)元素是屬性名,
字符串(或符號)
- 第二個(gè)元素是屬性值,
任何類型
對象的屬性默認(rèn)是可枚舉的,意味著它們可以在 for...in
循環(huán)中被枚舉出來
使用 Object.defineProperty
方法可以設(shè)置或修改屬性的可枚舉性
基本的用法如下:
- 基本用法:
const obj = { a: 1, b: 2, c: 3 }; const entries = Object.entries(obj); console.log(entries); // 輸出: [['a', 1], ['b', 2], ['c', 3]]
- 處理空對象:
const emptyObj = {}; const entries = Object.entries(emptyObj); console.log(entries); // 輸出: []
- 與其他方法的比較:
Object.keys(obj)
: 返回一個(gè)包含對象所有可枚舉屬性名的數(shù)組Object.values(obj)
:返回一個(gè)包含對象所有可枚舉屬性值的數(shù)組Object.entries(obj)
: 返回一個(gè)包含對象所有可枚舉屬性的鍵值對數(shù)組
const obj = { a: 1, b: 2, c: 3 }; console.log(Object.keys(obj)); // 輸出: ['a', 'b', 'c'] console.log(Object.values(obj)); // 輸出: [1, 2, 3] console.log(Object.entries(obj)); // 輸出: [['a', 1], ['b', 2], ['c', 3]]
- 非對象參數(shù):如果傳入非對象參數(shù)(如 null 或 undefined),
Object.entries
會(huì)拋出錯(cuò)誤
try { console.log(Object.entries(null)); } catch (e) { console.error(e); // 輸出: TypeError: Cannot convert undefined or null to object }
- 使用 for…of 迭代:
Object.entries
返回的數(shù)組可以使用for...of
迭代
const obj = { x: 10, y: 20, z: 30 }; for (const [key, value] of Object.entries(obj)) { console.log(`${key}: ${value}`); } // 輸出: // x: 10 // y: 20 // z: 30
2. Demo
示例 1:過濾對象的屬性
通過 Object.entries 結(jié)合 filter 方法,篩選出滿足特定條件的鍵值對
const obj = { a: 1, b: 2, c: 3, d: 4 }; const filteredEntries = Object.entries(obj).filter(([key, value]) => value > 2); console.log(filteredEntries); // 輸出: [['c', 3], ['d', 4]]
示例 2: 對象屬性值的轉(zhuǎn)換
使用 map 方法對對象屬性值進(jìn)行轉(zhuǎn)換,然后重新構(gòu)建對象
const obj = { name: 'Alice', age: 25 }; const transformedEntries = Object.entries(obj).map(([key, value]) => { return [key, typeof value === 'string' ? value.toUpperCase() : value]; }); const newObj = Object.fromEntries(transformedEntries); console.log(newObj); // 輸出: { name: 'ALICE', age: 25 }
示例 3:嵌套對象處理
const nestedObj = { user: { name: 'Bob', age: 30 }, location: { city: 'New York', country: 'USA' } }; const nestedEntries = Object.entries(nestedObj).flatMap(([key, value]) => Object.entries(value).map(([subKey, subValue]) => [`${key}.${subKey}`, subValue]) ); console.log(nestedEntries); // 輸出: [['user.name', 'Bob'], ['user.age', 30], ['location.city', 'New York'], ['location.country', 'USA']]
示例 4:動(dòng)態(tài)構(gòu)建對象
const entries = [['a', 1], ['b', 2], ['c', 3]]; const obj = Object.fromEntries(entries); console.log(obj); // 輸出: { a: 1, b: 2, c: 3 }
示例 5:結(jié)合其他方法進(jìn)行數(shù)據(jù)處理
使用 reduce 方法結(jié)合 Object.entries
對對象進(jìn)行復(fù)雜的數(shù)據(jù)處理
const obj = { apple: 10, banana: 20, cherry: 30 }; const total = Object.entries(obj).reduce((sum, [key, value]) => sum + value, 0); console.log(total); // 輸出: 60
示例 6:轉(zhuǎn)換對象為查詢字符串
const params = { name: 'Alice', age: 25, city: 'Wonderland' }; const queryString = Object.entries(params) .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`) .join('&'); console.log(queryString); // 輸出: 'name=Alice&age=25&city=Wonderland'
附:Object.entries()、Object.fromEntries()、ES6的Map三者之間的關(guān)系
簡要說明一下,三者的作用,后續(xù)依次通過代碼詳細(xì)具體演示三者之間存在的聯(lián)系
Object.entries 傳入一個(gè)對象,返回該對象的鍵值對的數(shù)組,即每個(gè)鍵和對應(yīng)的值,轉(zhuǎn)化為一個(gè)數(shù)組,以此類推,最后這些數(shù)組再被放到一個(gè)新數(shù)組中
Object.fromEntries 傳入一個(gè)數(shù)組,或者傳入一個(gè)Map,數(shù)組最好是和Object.entries生成的數(shù)組結(jié)構(gòu)一致,根據(jù)傳入的返回一個(gè)對象
Map ES6新增的數(shù)據(jù)結(jié)構(gòu),能夠進(jìn)行迭代,使用...展開運(yùn)算符可將Map類型轉(zhuǎn)化為Object.entries生成的數(shù)組對象 ,將Map傳入Object.fromEntries能得到一個(gè)對象
Object.entries和Object.fromEntries
const person = { name: '王二', age: 18, sex: '男', say() { console.log('說話'); } } const obj1 = Object.entries(person)//返回對象的鍵值對數(shù)組 const obj2 = Object.fromEntries(obj1);//通過上述的鍵值對數(shù)組,返回對應(yīng)的對象 console.log(obj1); console.log(obj2);
結(jié)果輸出
結(jié)果分析
上述可得,Object.entries和Object.fromEntries兩個(gè)得到的結(jié)果可以相互轉(zhuǎn)換
前者通過對象可以得到鍵值對數(shù)組,后者可以將前者的數(shù)組,轉(zhuǎn)化為對象
個(gè)人猜測,可以實(shí)現(xiàn)深拷貝
總結(jié)
到此這篇關(guān)于Js中的Object.entries()基本知識詳細(xì)分析的文章就介紹到這了,更多相關(guān)Js中Object.entries()基本知識內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JS生態(tài)系統(tǒng)加速一次一庫PostCSS SVGO的重構(gòu)源碼和性能優(yōu)化探索
這篇文章主要介紹了JS生態(tài)系統(tǒng)加速一次一庫PostCSS SVGO的重構(gòu)源碼和性能優(yōu)化探索,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01微信小程序?qū)崿F(xiàn)云開發(fā)上傳文件、圖片功能
在使用小程序的過程中,在編輯個(gè)人資料時(shí),通常會(huì)面臨上傳頭像、上傳背景圖片的情況,而這個(gè)開發(fā)過程需要怎樣實(shí)現(xiàn)呢?這篇文章主要給大家介紹了關(guān)于微信小程序?qū)崿F(xiàn)云開發(fā)上傳文件、圖片功能的相關(guān)資料,需要的朋友可以參考下2022-12-12JavaScript中使用arguments獲得函數(shù)傳參個(gè)數(shù)實(shí)例
這篇文章主要介紹了JavaScript中使用arguments獲得函數(shù)傳參個(gè)數(shù)實(shí)例,本文用了多個(gè)例子來講解arguments的使用,需要的朋友可以參考下2014-08-08深入理解JavaScript系列(34):設(shè)計(jì)模式之命令模式詳解
這篇文章主要介紹了深入理解JavaScript系列(34):設(shè)計(jì)模式之命令模式詳解,命令模式(Command)的定義是:用于將一個(gè)請求封裝成一個(gè)對象,從而使你可用不同的請求對客戶進(jìn)行參數(shù)化,對請求排隊(duì)或者記錄請求日志,以及執(zhí)行可撤銷的操作,需要的朋友可以參考下2015-03-03JavaScript實(shí)現(xiàn)秒數(shù)轉(zhuǎn)換時(shí)間的兩種格式
在開發(fā)過程中,經(jīng)常會(huì)遇到后臺接口返回的是以秒為單位的數(shù)據(jù),而我們需要將其轉(zhuǎn)換為一個(gè)更加易讀的格式,本文將介紹如何實(shí)現(xiàn)秒數(shù)轉(zhuǎn)時(shí)間的兩種格式,有需要的可以參考下2025-02-02JavaScript詳解使用Promise處理回調(diào)地獄的兩種方法
這篇文章主要介紹了JavaScript詳解使用Promise處理回調(diào)地獄的兩種方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-11-11js實(shí)現(xiàn)背景圖片感應(yīng)鼠標(biāo)變化的方法
這篇文章主要介紹了js實(shí)現(xiàn)背景圖片感應(yīng)鼠標(biāo)變化的方法,實(shí)例分析了javascript針對鼠標(biāo)事件與css樣式圖片的操作技巧,需要的朋友可以參考下2015-02-02原生javascript中this幾種常見用法總結(jié)
這篇文章主要介紹了原生javascript中this幾種常見用法,結(jié)合實(shí)例形式總結(jié)分析了JavaScript中this的功能、常見用法及操作注意事項(xiàng),需要的朋友可以參考下2020-02-02