如何同时解构和复制数组?

Iva*_*rst 5 javascript ecmascript-6 spread-syntax

我知道您可以使用扩展运算符复制数组:

const itemsArr = [...this.state.itemsArr];

您可以解构一个作为对象键值的数组:

const { itemsArr } = this.state

有没有一种方法可以将它们合并为一个步骤?伪代码:

const { itemsArr } = [...this.state]

或者

const { [...itemsArr] } = this.state

编辑:有没有一种方法可以将它们合并为一个步骤,以避免输入“itemsArr”两次?

dzi*_*raf 2

itemsArr它可以通过从以下副本解构来完成state:

const { itemsArr } = JSON.parse(JSON.stringify(this.state))
Run Code Online (Sandbox Code Playgroud)

这样做的优点是您的嵌套对象被克隆,因此您的嵌套state.itemsArr对象也被复制,并且修改itemsArr不会更改state. 缺点是,如果您的state对象包含函数,则无法使用此方法访问它们,而且您可能会质疑性能。

另一种复制方法state是使用Object.assign:

const { itemsArr } = Object.assign({}, this.state)
Run Code Online (Sandbox Code Playgroud)

有了这个,您可以访问其中的函数state,但它会进行浅复制,因此state.itemsArr不会被克隆。

ECMAScript2018 实际上有一个可以处理 JSON 对象的扩展运算符:

const { itemsArr } = { ...this.state }
Run Code Online (Sandbox Code Playgroud)

https://codesandbox.io/s/32qvzjy2op(看看你的浏览器控制台,工具里的那个是坏的)。

但话又说回来,它只做了一个浅拷贝。

最好的方法是编写/导入一个deepCopy函数,该函数使用其嵌套属性和函数来克隆对象。

https://lodash.com/docs#cloneDeep