作者:Yazeed Bzadough

译者:allen

JavaScript 有很多方法可以做任何事情,现在我们研究数组。

1.扩展运算符(浅拷贝)

自从 ES6 发布以来,这一直是最受欢迎的方法。这是一个简短的语法,你会发现它在使用像 React 和 Redux 这样的库时非常有用。

numbers = [1, 2, 3];

numbersCopy = [...numbers];

注意:这不能安全地复制多维数组。数组/对象值通过引用而不是按值复制。

这可以

numbersCopy.push(4);

console.log(numbers, numbersCopy);

// [1, 2, 3] and [1, 2, 3, 4]

// numbers is left alone

这不可以

nestedNumbers = [[1], [2]];

numbersCopy = [...nestedNumbers];

numbersCopy[0].push(300);

console.log(nestedNumbers, numbersCopy);

// [[1, 300], [2]]

// [[1, 300], [2]]

// They've both been changed because they share references

2.for 循环(浅拷贝)

由于我们的圈子中流行的函数式编程,使得这种方法最不受欢迎

numbers = [1, 2, 3];

numbersCopy = [];

for (i = 0; i < numbers.length; i++) {

numbersCopy[i] = numbers[i];

}

注意:这不能安全地复制多维数组。由于你使用的是=运算符,因此它将通过引用而不是值来分配对象/数组。

这可以

numbersCopy.push(4);

console.log(numbers, numbersCopy);

// [1, 2, 3] and [1, 2, 3, 4]

// numbers is left alone

这不可以

nestedNumbers = [[1], [2]];

numbersCopy = [];

for (i = 0; i < nestedNumbers.length; i++) {

numbersCopy[i] = nestedNumbers[i];

}

numbersCopy[0].push(300);

console.log(nestedNumbers, numbersCopy);

// [[1, 300], [2]]

// [[1, 300], [2]]

// They've both been changed because they share references

3.while 循环(浅拷贝)

同 for 循环一样,不纯的、命令式的, blah, blah, blah... 但有效!

numbers = [1, 2, 3];

numbersCopy = [];

i = -1;

while (++i < numbers.length) {

numbersCopy[i] = numbers[i];

}

注意:这也通过引用而不是按值分配对象/数组。

这可以

numbersCopy.push(4);

console.log(numbers, numbersCopy);

// [1, 2, 3] and [1, 2, 3, 4]

// numbers is left alone

这不可以

    nestedNumbers = [[1], [2]];

numbersCopy = [];

i = -1;

while (++i < nestedNumbers.length) {

numbersCopy[i] = nestedNumbers[i];

}

numbersCopy[0].push(300);

console.log(nestedNumbers, numbersCopy);

// [[1, 300], [2]]

// [[1, 300], [2]]

// They've both been changed because they share references

4.Array.map (浅拷贝)

回到现代领域,我们将找到 map 函数,基于数学,map 是将一组转换为另一种类型的集合,同时保留结构的概念。

这意味着 Array.map 每次都返回一个长度相同的数组。

要使列表中数字加倍,可以使用 map 带加倍函数

numbers = [1, 2, 3];

double = (x) => x * 2;

numbers.map(double);

什么是克隆

没错,这篇文章是关于克隆数组的。要复制数组,只需返回 map 调用中的元素即可。

numbers = [1, 2, 3];

numbersCopy = numbers.map((x) => x);

如果你想更数学一点,(x)=> x 被称为身份。它返回给出的任何参数。

map(identity) 复制一个列表

identity = (x) => x;

numbers.map(identity);

// [1, 2, 3]

注意:这也通过引用而不是按值分配对象/数组。

5.Array.filter (浅拷贝)

此函数返回一个数组,就像 map 一样,但它不能保证长度相同。

如果你要过滤偶数数字怎么办?

[1, 2, 3].filter((x) => x % 2 === 0)

// [2]

输入数组长度为3,但结果长度为1。

如果 filter 始终返回 true,就会重复

numbers = [1, 2, 3];

numbersCopy = numbers.filter(() => true);

每个元素都通过测试,因此返回。

注意:这也通过引用而不是按值分配对象/数组。

6.Array.reduce (浅拷贝)

使用 reduce 来克隆数组感觉非常不好,因为它远比此强大,让我们开始...

numbers = [1, 2, 3];

numbersCopy = numbers.reduce((newArray, element) => {

newArray.push(element);

return newArray;

}, []);

reduce 在循环遍历列表时转换初始值。

这里的初始值是一个空数组,我们将逐步填充每个元素。必须从要在下一次迭代中使用的函数返回该数组。

注意:这也通过引用而不是按值分配对象/数组。

7.Array.slice (浅拷贝)

slice 根据你提供的开始/结束索引返回数组的副本。

如果我们想要前3个元素:

[1, 2, 3, 4, 5].slice(0, 3);

// [1, 2, 3]

// Starts at index 0, stops at index 3

如果我们想要所有元素,请不要给出任何参数

numbers = [1, 2, 3, 4, 5];

numbersCopy = numbers.slice();

// [1, 2, 3, 4, 5]

注意:这也通过引用而不是按值分配对象/数组。

8.JSON.parse 和 JSON.stringify (深拷贝)

JSON.stringify 将对象转换为字符串

JSON.parse 将字符串转换为对象

组合它们可以将对象转换为字符串,然后反转该过程以创建全新的数据结构。

注意:这也通过引用而不是按值分配对象/数组。

nestedNumbers = [[1], [2]];

numbersCopy = JSON.parse(

JSON.stringify(nestedNumbers)

);

numbersCopy[0].push(300);

console.log(nestedNumbers, numbersCopy);

// [[1], [2]]

// [[1, 300], [2]]

// These two arrays are completely separate!

9.Array.concat (浅拷贝)

concat 将数组与值或其他数组组合在一起。

[1, 2, 3].concat(4); // [1, 2, 3, 4]

[1, 2, 3].concat([4, 5]); // [1, 2, 3, 4, 5]

如果你不提供任何内容或空数组,则返回副本。

[1, 2, 3].concat(); // [1, 2, 3]

[1, 2, 3].concat([]); // [1, 2, 3]

注意:这也通过引用而不是按值分配对象/数组。

10.Array.from (浅拷贝)

这可以将任何可迭代对象转换为数组。给数组返回一个副本。

numbers = [1, 2, 3];

numbersCopy = Array.from(numbers)

// [1, 2, 3]

注意:这也通过引用而不是按值分配对象/数组。

总结

嗯,这很有趣

我试着只用一步就克隆了。如果你采用多种方法和技术,你会发现更多方法。

hdfs中与file数组类似的数组_如何在 JavaScript 中克隆数组相关推荐

  1. javascript编写_如何在JavaScript中使用解构来编写更简洁,功能更强大的代码

    javascript编写 by Ashay Mandwarya ?️?? 由Ashay Mandwarya提供吗? 如何在JavaScript中使用解构来编写更简洁,功能更强大的代码 (How to ...

  2. java+script+当前日期_如何在JavaScript中获取当前日期?

    如何在JavaScript中获取当前日期? #1楼 您可以使用扩展了 Date对象的Date.js库,从而可以使用.today()方法. #2楼 如果您想对日期格式进行更多的粒度控制,我强烈建议您查看 ...

  3. javascript案例_如何在JavaScript中使用增强现实-一个案例研究

    javascript案例 by Apurav Chauhan 通过Apurav Chauhan 如何在JavaScript中使用增强现实-一个案例研究 (How to use Augmented Re ...

  4. regexp 好汉字符串_如何在JavaScript中使用RegExp确认字符串的结尾

    regexp 好汉字符串 by Catherine Vassant (aka Codingk8) 由凯瑟琳·瓦森(Catherine Vassant)(又名Codingk8) 如何在JavaScrip ...

  5. javascript字典中添加数组_如何在 JavaScript 中更好地使用数组

    在 freeCodeCamp 社区阅读原文. 本文短小精悍,我保证.在过去的数个月里,我注意到在我审阅的 pull request 中有四个(关于数组使用的)错误经常出现.同时,我自己也会犯这些错误, ...

  6. javascript字典中添加数组_如何在JavaScript中使用数组方法:Mutator方法

    JavaScript中的数组由元素列表组成.JavaScript有许多有用的内置方法来处理数组.修改原始数组的方法称为mutator方法,返回新值或表示的方法称为accessor方法.在本教程中,我们 ...

  7. java从数组查找指定整数_如何在Java中使用重复项查找整数数组中的K个缺失数字?...

    java从数组查找指定整数 自从我讨论任何编码或算法面试问题以来已经有很长时间了,因此我想重新考虑一种最流行的基于数组的编码问题,即在给定数组中查找缺失的数字. 在进行编程工作面试之前,您可能已经听说 ...

  8. javascript中索引_如何在JavaScript中找到数字在数组中所属的索引

    javascript中索引 Sorting is a very important concept when writing algorithms. There are all kinds of so ...

  9. java 格式化 浮点数_如何在javascript中格式化浮点数?

    回答(13) 2 years ago 我猜的关键是首先正确地向上舍入,然后你可以将它转换为String . function roundOf(n, p) { const n1 = n * Math.p ...

最新文章

  1. Kotlin 数组的使用
  2. win7下,发布到iis上,本地可以正常访问,远程访问失败
  3. printf/scanf格式控制符的完整格式
  4. 让TP5.0在SWOOLE上飞起来
  5. Swift傻傻分不清楚系列(二)数据类型
  6. Linux杂碎2/SHELL
  7. java微信支付异步通知_Java中微信支付退款异步通知解码
  8. sql server 缓存_了解SQL Server查询计划缓存
  9. JavaScript执行机制-node事件循环
  10. easyui datagrid 列的内容超出所定义的列宽时,自动换行
  11. 计算机网络连接限制,网络受限制或无连接怎么办?电脑网络连接受限制或无连接问题...
  12. EffNet图像分类--分类精子图片优化!
  13. mysql 2002_解决MySQL报错ERROR 2002 (HY000)
  14. R和RStudio安装包下载
  15. 流域水库水闸和泵站无人值守系统
  16. java-php-python-ssm企业人事管理系统计算机毕业设计
  17. 阿里云服务器上安装nginx
  18. 在线问答“三重门”:知识、营销与服务直达
  19. MATLAB的global变量
  20. 左耳听风 第二十二周

热门文章

  1. 【剑指offer】面试题49:丑数
  2. 3dmax体积雾渲染不出来_【扮家家云渲染效果图】3Dmax体积光制作丛林光束|干货教程...
  3. android 人脸识别_小模型,高精度!小视科技推出极致轻量型人脸识别SDK
  4. priority_queue实现大顶堆和小顶堆
  5. Python删除文件夹和建立文件夹
  6. python保存和加载数组
  7. 辗转相除法--最大公约数/最大公倍数
  8. 安卓逆向_15( 三 ) --- Android NDK 开发【 jni 静态注册、JNI_OnLoad 动态注册】
  9. p1和p7签名的区别
  10. ActiveMQ消费者平滑关闭