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

Posted

技术标签:

【中文标题】如何同时解构和复制数组?【英文标题】:How to destructure and copy an array simultaneously? 【发布时间】:2019-01-31 23:22:19 【问题描述】:

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

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

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

const itemsArr = this.state

有没有办法将它们组合成一个步骤?伪代码:

const itemsArr = [...this.state]

const [...itemsArr] = this.state

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

【问题讨论】:

你的意思是const itemsArr: [...itemsArr] = this.state;?您也可以重命名变量:const itemsArr: [...renamedArray] = this.state;. @Xufox 没有想到这种方式 - 与 const itemsArr = [...this.state.itemsArr] 基本相同,对吗?目标是避免两次输入“itemsArr”——我会在我的问题中添加该注释。谢谢! 不,你不能不重新输入 目前,const [...itemsArr] = this.state 是一个 SyntaxError,虽然我不知道规范的知识来解释为什么......也许,这可能会在未来成为有效的语法。 为什么你必须尝试通过结合解构来使用古怪的语法来缩短你的代码?只需让代码可读。 【参考方案1】:

可以通过从state 的副本中解构itemsArr 来完成:

const  itemsArr  = JSON.parse(JSON.stringify(this.state))

这样做的好处是你的嵌套对象被克隆了,所以你的state.itemsArr也被复制了,修改itemsArr不会改变state中的数组。 缺点是如果您的state 对象包含函数,则使用此方法将无法访问它们,而且您可以质疑性能。

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

const  itemsArr  = Object.assign(, this.state)

有了它,您可以访问state 内部的函数,但它会生成浅拷贝,因此state.itemsArr 不会被克隆。

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

const  itemsArr  =  ...this.state 

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

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

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

https://lodash.com/docs#cloneDeep

【讨论】:

ECMAScript2018 sn-p 最接近我的要求,谢谢。 +1 Object.assign,没想到

以上是关于如何同时解构和复制数组?的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript------解构赋值

JS对象解构

如何在 JavaScript 中反转数组,同时保留原始数组的原始值? [复制]

数组解构赋值

在 Java 中,如何将字节数组转换为十六进制数字字符串,同时保持前导零? [复制]

在 Java 中,如何将字节数组转换为十六进制数字字符串,同时保持前导零? [复制]