[譯]使用 JavaScript 物件 Rest 和 Spread 的7個技巧
- 原文作者:Joel Thoms
- 原文標題:7 Tricks with Resting and Spreading JavaScript Objects
- 原文:blog.bitsrc.io/6-tricks-wi…
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!' }
複製程式碼
摘要
我試著列出了一些鮮為人知的 Spread 和 Rest 技巧,如果你知道任何我沒有列在這裡技巧,請在評論區裡讓每個人都知道!如果你從中學到了新的東西,請在 Twitter 上和你的朋友分享,這真的很有幫助!
請在這裡或者推特 @joelnet 關注我!