對(duì)象擴(kuò)展運(yùn)算符的 7 種技巧

翻譯 7 Tricks with Resting and Spreading JavaScript Objects

擴(kuò)展運(yùn)算符不僅僅是用來解構(gòu)參數(shù)或者擴(kuò)展數(shù)組。

下面介紹 7 種你可能不知道的對(duì)象擴(kuò)展運(yùn)算符小技巧。

添加屬性

在克隆對(duì)象的同時(shí)可以直接添加額外的屬性到克隆后的對(duì)象。

下面的侄子,user 是已經(jīng)被克隆了,然后 password 也被添加到對(duì)象 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!' }

合并對(duì)象

可以將兩個(gè)對(duì)象合并成一個(gè)新的對(duì)象。

下面侄子中,part1part2 被合并到 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!' }

移除對(duì)象屬性

可以將解構(gòu)語法和擴(kuò)展運(yùn)算符結(jié)合來移除對(duì)象中的屬性。下面例子中,password 被解構(gòu)出來 (然后被忽略),rest 屬性再以 rest 返回。

const noPassword = ({ password, ...rest }) => rest
const user = {
  id: 100,
  name: 'Howard Moon',
  password: 'Password!'
}

noPassword(user) //=> { id: 100, name: 'Howard moon' }

動(dòng)態(tài)移除對(duì)象屬性

removeProperty 函數(shù)接收 prop 參數(shù),使用計(jì)算對(duì)象屬性名,prop可以從克隆對(duì)象被動(dòng)態(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!' }

屬性排序

有時(shí)候?qū)ο髮傩缘捻樞虿⒉蝗缫?,通過下面的小技巧我們可以將屬性放到頂部或者底部。

下面例子在展開對(duì)象 object 前先添加 id: undefined 到新對(duì)象,從而將 id 移到最前面。

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 移到最后的位置,首先將 passwordobject 解構(gòu)出來 ,然后將 password 放在展開的 object 里。

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!' }

默認(rèn)屬性

默認(rèn)屬性是當(dāng)對(duì)象沒有這個(gè)屬性,會(huì)賦值一個(gè)默認(rèn)值給這個(gè)屬性。

下面例子中,user2 不包含 quotes。setDefault 函數(shù)可以確保所有對(duì)象都有 quotes 屬性,如果沒有那么 quotes[]。

當(dāng)調(diào)用 setDefaults(user2) 的時(shí)候,返回值會(huì)包含 quotes:[]。

當(dāng)調(diào)用 setDefaults(user4) 的時(shí)候,因?yàn)?user4 已經(jīng)有 quotes,屬性值不會(huì)被修改。

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..."]
//=> }

如果你想讓默認(rèn)值放到首位也可以這樣寫:

const setDefaults = ({ ...object}) => ({ quotes: [], ...object })

重命名屬性

結(jié)合上面的小技巧,可以定義一個(gè)函數(shù)來重命名屬性。

假想一個(gè)場景,對(duì)象里有屬性 ID,現(xiàn)在我們要把它變成 id。首先要做的是將 IDobject 解構(gòu)出來,然后在 object 展開的時(shí)候以 id 添加回對(duì)象。

const renamed = ({ ID, ...object }) => ({ id: ID, ...object })

const user = {
  ID: 500,
  name: "Bob Fossil"
}

renamed(user) //=> { id: 5000, name: 'Bob Fossil' }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.屬性的簡潔表示法 允許直接寫入變量和函數(shù) 上面代碼表明,ES6 允許在對(duì)象之中,直接寫變量。這時(shí),屬性名為變量...
    雨飛飛雨閱讀 1,263評(píng)論 0 3
  • ORA-00001: 違反唯一約束條件 (.) 錯(cuò)誤說明:當(dāng)在唯一索引所對(duì)應(yīng)的列上鍵入重復(fù)值時(shí),會(huì)觸發(fā)此異常。 O...
    我想起個(gè)好名字閱讀 5,966評(píng)論 0 9
  • 第四章 擴(kuò)展對(duì)象的功能性 1. 對(duì)象字面量語法擴(kuò)展 直接看例子 ES6中通過屬性初始化的簡寫語法,可以消除這種屬性...
    NowhereToRun閱讀 810評(píng)論 0 2
  • 1、使用數(shù)組拼接出如下字符串 代碼如下 2寫出兩種以上聲明多行字符串的方法 3、補(bǔ)全如下代碼,讓輸出結(jié)果為字符串:...
    暫時(shí)沒有好名字閱讀 301評(píng)論 0 0
  • 第一次聽長投,是因?yàn)槲夜霉茫陂L投學(xué)習(xí)之后,極力推薦給我,讓我來學(xué)習(xí)。一開始我也是抱著試一試的心里,9.9能學(xué)習(xí)...
    Fu2k_4cfb閱讀 160評(píng)論 0 3

友情鏈接更多精彩內(nèi)容