摘要:下面針對對象時使用和時的個鮮為人知的技巧。對屬性進行排序有時性質(zhì)并不按照我們需要的順序排列。若要將移到最后一個屬性,請從對象中解構(gòu)。默認屬性默認屬性是僅當它們不包含在原始對象中時才設置的值。
[譯]使用 JavaScript 對象 Rest 和 Spread 的7個技巧
原文作者:Joel Thoms
原文標題:7 Tricks with Resting and Spreading JavaScript Objects
原文:https://blog.bitsrc.io/6-tric...
Rest 和 Spread 操作符不僅僅可以用于讓參數(shù)休息和擴展數(shù)組。
下面針對 JavaScript 對象時使用 Rest 和 Spread 時的 7 個鮮為人知的技巧。
添加屬性克隆一個對象,同時向(淺)克隆對象添加附加屬性。
在這個示例中,user 被克隆,password 屬性被添加到 userWithPass 中。
const user = { id: 100, name: "Howard Moon"} const userWithPass = { ...user, password: "Password!" } user //=> { id: 100, name: "Howard Moon" } userWithPass //=> { id: 100, name: "Howard Moon", password: "Password!" }對象合并
將兩個對象合并到一個新對象中。
將 Part1 和 Part2 合并到 user1中。
const part1 = { id: 100, name: "Howard Moon" } const part2 = { id: 100, password: "Password!" } const user1 = { ...part1, ...part2 } //=> { id: 100, name: "Howard Moon", password: "Password!" }
對象也可以使用以下語法合并:
const partial = { id: 100, name: "Howard Moon" } const user = { ...partial, id: 100, password: "Password!" } user //=> { id: 100, name: "Howard Moon", password: "Password!" }排除對象屬性
可以結(jié)合使用解構(gòu) rest 運算符刪除屬性。 在這里,password 被刪除 ,其余的屬性作為 rest 返回。
const noPassword = ({ password, ...rest }) => rest const user = { id: 100, name: "Howard Moon", password: "Password!" } noPassword(user) //=> { id: 100, name: "Howard moon" }動態(tài)排除屬性
函數(shù)接受一個 prop 作為參數(shù)。使用計算對象屬性名稱,可以從克隆中動態(tài)地刪除屬性。
const user1 = { id: 100, name: "Howard Moon", password: "Password!" } const removeProperty = prop => ({ [prop]: _, ...rest }) => rest // ---- ------ // / // dynamic destructuring const removePassword = removeProperty("password") const removeId = removeProperty("id") removePassword(user1) //=> { id: 100, name: "Howard Moon" } removeId(user1) //=> { name: "Howard Moon", password: "Password!" }對屬性進行排序
有時性質(zhì)并不按照我們需要的順序排列。 使用一些技巧,我們可以將屬性推到列表的頂部,或者將它們移到底部。
若要將 id 移動到第一個位置,在擴展對象之前將 id: undefined 添加到新的 Object 最前面。
const user3 = { password: "Password!", name: "Naboo", id: 300 } const organize = object => ({ id: undefined, ...object }) // ------------- // / // move id to the first property organize(user3) //=> { id: 300, password: "Password!", name: "Naboo" }
若要將 password 移到最后一個屬性,請從對象中解構(gòu) password。然后在使用 Rest 操作符后重新設置 password 屬性。
const user3 = { password: "Password!", name: "Naboo", id: 300 } const organize = ({ password, ...object }) => ({ ...object, password }) // -------- // / // move password to last property organize(user3) //=> { name: "Naboo", id: 300, password: "Password!" }默認屬性
默認屬性是僅當它們不包含在原始對象中時才設置的值。
在本例中,user2 不包含 quotes 屬性。 setdefaults 函數(shù)確保所有對象都設置了 quotes 屬性,否則它將被設置為[]。
當調(diào)用 setDefaults (user2)時,返回值將包含 quotes 屬性: []。
在調(diào)用 setDefaults (user4)時,因為 user4 已經(jīng)有了 quotes 屬性,所以不會修改該屬性。
const user2 = { id: 200, name: "Vince Noir" } const user4 = { id: 400, name: "Bollo", quotes: ["I"ve got a bad feeling about this..."] } const setDefaults = ({ quotes = [], ...object}) => ({ ...object, quotes }) setDefaults(user2) //=> { id: 200, name: "Vince Noir", quotes: [] } setDefaults(user4) //=> { //=> id: 400, //=> name: "Bollo", //=> quotes: ["I"ve got a bad feeling about this..."] //=> }
如果你希望默認值先出現(xiàn)而不是后出現(xiàn),也可以這樣寫:
const setDefaults = ({ ...object}) => ({ quotes: [], ...object })屬性重命名
通過結(jié)合上面的技術(shù),可以創(chuàng)建一個函數(shù)來重命名屬性。
假設有一些大寫 ID 的對象屬性名應該是小寫的 id。 首先從對象解構(gòu) ID 然后在對象 Spread 時將其作為 id 添加回去。
const renamed = ({ ID, ...object }) => ({ id: ID, ...object }) const user = { ID: 500, name: "Bob Fossil" } renamed(user) //=> { id: 500, name: "Bob Fossil" }附贈:添加條件屬性
感謝 @vinialbano 指出你也可以有條件地添加屬性。 在這個例子中,只有當 password 是真實的時候才會添加 password!
const user = { id: 100, name: "Howard Moon" } const password = "Password!" const userWithPassword = { ...user, id: 100, ...(password && { password }) } userWithPassword //=> { id: 100, name: "Howard Moon", password: "Password!" }摘要
我試著列出了一些鮮為人知的 Spread 和 Rest 技巧,如果你知道任何我沒有列在這里技巧,請在評論區(qū)里讓每個人都知道!如果你從中學到了新的東西,請在 Twitter 上和你的朋友分享,這真的很有幫助!
請在這里或者推特 @joelnet 關注我!
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/102836.html
摘要:變量聲明與賦值值傳遞淺拷貝與深拷貝詳解歸納于筆者的現(xiàn)代開發(fā)語法基礎與實踐技巧系列文章。變量聲明在中,基本的變量聲明可以用方式允許省略,直接對未聲明的變量賦值。按值傳遞中函數(shù)的形參是被調(diào)用時所傳實參的副本。 ES6 變量聲明與賦值:值傳遞、淺拷貝與深拷貝詳解歸納于筆者的現(xiàn)代 JavaScript 開發(fā):語法基礎與實踐技巧系列文章。本文首先介紹 ES6 中常用的三種變量聲明方式,然后討論了...
摘要:如果添加屬性不可避免,要使用方法。如果對象的屬性名是動態(tài)的,可以在創(chuàng)造對象的時候,使用屬性表達式定義。 一些稍微優(yōu)雅的技巧寫法,并不是非的是es6,標題黨了哈 為class綁定多個值 普通寫法 :class={a: true, b: true} 其他 :class=[btn, btn2, {a: true, b: false}] 一個值判斷a或者判斷b 普通寫法 if(flg === ...
摘要:為了使程序員能夠一次一個地處理集合中的元素,引入了迭代器接口。迭代器使用該方法獲取對象屬性名稱的數(shù)組,然后將其分配給常量。迭代器的缺點是它們不適合表示異步數(shù)據(jù)源。每次循環(huán)時,都會調(diào)用迭代器的方法,它返回一個。 前言 原文地址:https://css-tricks.com/new-es2018-features-every-javascript-developer-should-kno...
摘要:前端日報精選三思而后行想提高團隊技術(shù),來試試這個套路如何開發(fā)一個插件學習筆記塊級作用域綁定譯文詳解帶來的個重大變化中文周二放送畫圖知乎專欄第期新特性譯配置譯高性能視差滾動行代碼構(gòu)建區(qū)塊鏈知乎專欄渲染器修仙之路之拷貝對象已 2017-07-25 前端日報 精選 SSR 三思而后行想提高團隊技術(shù),來試試這個套路!如何開發(fā)一個 Atom 插件ES6學習筆記:塊級作用域綁定【譯文】詳解VUE2...
摘要:改動函數(shù)的改變不算太大,都是一些其他語言早就有的功能,而一直比較欠缺的,比如函數(shù)參數(shù)默認值,任意參數(shù)的表示法,最大的變化應該是支持箭頭函數(shù)其他語言稱之為表達式,一種對匿名函數(shù)的一種簡寫方式,以下來探討一下函數(shù)在中的一些改變默認參數(shù)任意參數(shù)操 ES6 functions改動 ????ES6函數(shù)的改變不算太大,都是一些其他語言早就有的功能,而Javascript一直比較欠缺的,比如函數(shù)參數(shù)...
閱讀 644·2021-11-22 15:32
閱讀 2731·2021-11-19 09:40
閱讀 2323·2021-11-17 09:33
閱讀 1281·2021-11-15 11:36
閱讀 1881·2021-10-11 10:59
閱讀 1491·2019-08-29 16:41
閱讀 1794·2019-08-29 13:45
閱讀 2166·2019-08-26 13:36