1. 程式人生 > 程式設計 >JS ES6展開運算子的幾個妙用

JS ES6展開運算子的幾個妙用

1. 新增屬性

複製物件的同時,為其新增新的屬性。

例子中複製了user物件到userWithPass,並添加了password屬性。

const user = { id: 110,name: 'Kayson Li'}
const userWithPass = { ...user,password: 'Password!' }

user //=> { id: 110,name: 'Kayson Li'}
userWithPass //=> {  id: 110,name: 'Kayson Li',password: 'Password!' }

2. 合併多個物件

利用...可以合併www.cppcns.com

多個物件到一個新的物件。part1和part2合併到user1:

const part1 = {  id: 110,name: 'Kayson Li' }
const part2 = { id: 110,password: 'Password!' }

const user1 = { ...part1,...part2 }
//=> { id: 110,name: 'Kayson L程式設計客棧i',password: 'Password!' }

3. 移除物件屬性

可以結合使用解構和剩餘操作符刪除物件的屬性。例子中password被解構出來,其他屬性保留在rest物件裡並被返回。

const noPassword = ({ password,...rest }) => rest
const user = {
  id: 110,password: 'Password!'
}

noPassword(user) //=> { id: 110,name: 'Kayson Li' }

4.動態移除屬性

來看一個例子。removeProperty函式接受一個引數prop,利用動態屬性名這個特性,prop可以動態地從拷貝物件中移除。

const user1 = {
  id: 110,password: 'Password!'
}
const removeProperty = prop => ({ [prop]: _,...rest }) => rest
//                     ----       ------
//                          \   /
//                      動態解構

const removePassword = removeProperty('password')
const removeId = removeProperty('id')

removePassword(user1) //=> { id: 110,name: 'Kayson Li' }
removeId(user1) //=> { name: 'Kayson Li',password: 'Password!' }

5. 調整屬性順序

有時候物件的屬性並不是我們想要的順序。利用一些技巧,可以將屬性移到最前面或最後面。

為了把id移到最前面,可以把id: undefined放在展開object的前面:

const user3 = {
  password: 'Password!',name: 'Bruce',id: 300
}

const organize = object => ({ id: undefined,...object })
//                            -------------
//                          /
//  移動 id 到第一個屬性位置

organize(user3)
//=> { id: 300,password: 'Password!',name: 'Bruce' }

要把password移動到最後位置,先從object中解構出password,然後把password放在展開object的後面:

const user3 = {
  password: 'Password!',id: 300
}

const organize = ({ password,...object }) =>
  ({ ...object,password })
//              --------
// www.cppcns.com            /
// 把 password 移動到最後

organize(user3)
//=> { name: 'Bruce',id: 300,password: 'Password!' }

6. 設定屬性預設值

當物件不存在某個屬性時,我們有時候需要給物件新增這個屬性,並設定一個預設值。

例如,user2沒有quotes屬性,setDefaults函式的作用是確保所有物件都有quotes,並有個預設值[]。

執行setDefaults(user2),返回的物件包含quotes: []。

執行 setDefaults(user4),由於userQndsqQuP4已經有quotes了,那它就保持不變。

const user2 = {
  id: 200,name: 'Jack Ma'
}

const user4 = {
  id: 400,name: '魯迅',quotes: ["我沒說過這句話……"]
}

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

setDefaults(user2)
//=> { id: 200,name: 'Jack Ma',quotes: [] }

setDefaults(user4)
//=> {
//=>   id: 400,//=>   name: '魯迅',//=>   quotes: ["我沒說過這句話……"]
//=> }

如果想讓這個屬性在最前面,可以這樣寫:

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

7: 屬性重新命名

結合前面的幾個技巧,我們可以寫一個給屬性重新命名的函式。

假設某些物件都有大寫的ID屬性,我們想讓它們都變成小寫,該怎麼做呢?先從object中解構出ID的值,然後再把這個值合併到新物件裡,改成小寫的id:

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

const user = {
  ID: 500,name: "張全蛋"
}

renamed(user) //=> { id: 500,name: '張全蛋' }

8. 還有更秀的操作

可以根據條件決定是否新增某個屬性,這在構造請求引數的時候非常有用。比如,我們只在password有值的情況才新增該屬性:

const user = { id: 110,name: 'Kayson Li' }
const password = 'Password!'
const userWithPassword = {
  ...user,id: 100,...(password && { password })
}

userWithPasswQndsqQuPord //=> { id: 110,password: 'Password!' }

以上就是js ES6展開運算子的幾個妙用的詳細內容,更多關於JS ES6展開運算子的資料請關注我們其它相關文章!