首頁  >  文章  >  web前端  >  JavaScript物件Rest和Spread的使用技巧(附程式碼)

JavaScript物件Rest和Spread的使用技巧(附程式碼)

不言
不言轉載
2019-03-22 09:35:012129瀏覽

這篇文章帶給大家的內容是關於JavaScript物件Rest和Spread的使用技巧(附程式碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

Rest 和 Spread 運算子不只可以用來讓參數休息和擴充陣列。

下面在針對 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!' }

排除物件屬性

可以結合使用解構 rest 運算子刪除屬性。在這裡,password 被刪除 ,其餘的屬性作為 rest 返回。

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

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

動態排除屬性

函數接受一個 prop 作為參數。使用計算物件屬性名稱,可以從克隆中動態地刪除屬性。

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

對屬性進行排序

有時性質並不會按照我們需要的順序排列。使用一些技巧,我們可以將屬性推到清單的頂部,或將它們移到底部。

若要將 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 移到最後一個屬性,請從物件解構 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 函數確保所有物件都設定了 quotes 屬性,否則它將被設定為[]。

當呼叫 setDefaults (user2)時,傳回值將包含 quotes 屬性: []。

在呼叫 setDefaults (user4)時,因為 user4 已經有了 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..."]
//=> }

如果你希望預設值先出現而不是後出現,也可以這樣寫:

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

屬性重命名

透過結合上面的技術,可以建立一個函數來重命名屬性。

假設有一些大寫 ID 的物件屬性名稱應該是小寫的 id。首先從物件解構 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!' }

這篇文章到這裡就已經全部結束了,更多其他精彩內容可以關注PHP中文網的JavaScript教學影片欄位!

以上是JavaScript物件Rest和Spread的使用技巧(附程式碼)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:segmentfault.com。如有侵權,請聯絡admin@php.cn刪除