对象扩展运算符的 7 种技巧

作者: 写代码的海怪 | 来源:发表于2019-03-17 01:44 被阅读17次

翻译 7 Tricks with Resting and Spreading JavaScript Objects

扩展运算符不仅仅是用来解构参数或者扩展数组。

下面介绍 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!' }

合并对象

可以将两个对象合并成一个新的对象。

下面侄子中,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!' }

移除对象属性

可以将解构语法和扩展运算符结合来移除对象中的属性。下面例子中,password 被解构出来 (然后被忽略),rest 属性再以 rest 返回。

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

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

动态移除对象属性

removeProperty 函数接收 prop 参数,使用计算对象属性名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!' }

属性排序

有时候对象属性的顺序并不如意,通过下面的小技巧我们可以将属性放到顶部或者底部。

下面例子在展开对象 object 前先添加 id: undefined 到新对象,从而将 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 解构出来 ,然后将 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!' }

默认属性

默认属性是当对象没有这个属性,会赋值一个默认值给这个属性。

下面例子中,user2 不包含 quotessetDefault 函数可以确保所有对象都有 quotes 属性,如果没有那么 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。首先要做的是将 IDobject 解构出来,然后在 object 展开的时候以 id 添加回对象。

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

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

renamed(user) //=> { id: 5000, name: 'Bob Fossil' }

相关文章

  • 对象扩展运算符的 7 种技巧

    翻译 7 Tricks with Resting and Spreading JavaScript Objects...

  • 解构赋值,函数扩展默认值

    扩展运算符 对象的扩展运算符(...)用于取出参数对象的所有可遍历属性,拷贝到当前对象之中。 对象的扩展运算符等同...

  • es6-运算符新增

    7.运算符的扩展 (1)链判断运算符?.有三种写法。解决对象属性多层级调用需要先判断对象是否存在的问题;语法:用?...

  • es6之扩展运算符 三个点(...)

    es6之扩展运算符 三个点(...)对象的扩展运算符数组的扩展运算符总结es6之扩展运算符 三个点(…)对象的扩展...

  • ES6之解构赋值/剩余运算符/箭头函数

    扩展运算符(对象) 扩展运算符(数组) 扩展运算符和Object.assign对对象进行合并的行为,是属于浅拷贝 ...

  • ES6之扩展运算符-对象

    Spread扩展运算符 (1) 复制对象(深拷贝) 拷贝了对象实例的属性对象的扩展运算符(...)用于取出参数对象...

  • es6之扩展运算符 三个点(...)

    对象的扩展运算符 理解对象的扩展运算符其实很简单,只要记住一句话就可以: 对象中的扩展运算符(...)用于取出参数...

  • ES6(八)迭代器与生成器3

    1.扩展运算符与非数组的可迭代对象 2.传递参数给迭代器 扩展运算符与非数组的可迭代对象 扩展运算符( ... )...

  • 内置对象扩展(Array)

    Array 的扩展方法 扩展运算符(展开语法) 扩展运算符可以将数组或者对象转为用逗号分隔的参数序列 扩展运算符可...

  • es6之扩展运算符 三个点(...)

    es6之扩展运算符 三个点(…) 对象的扩展运算符理解对象的扩展运算符其实很简单,只要记住一句话就可以:对象中的扩...

网友评论

    本文标题:对象扩展运算符的 7 种技巧

    本文链接:https://www.haomeiwen.com/subject/jchymqtx.html