原文网址:JS--拷贝数组的方法(浅拷贝)_IT利刃出鞘的博客-CSDN博客

简介

本文介绍JS拷贝数组的方法。

本文介绍的拷贝方式都是浅拷贝,拷贝的是引用。如果数组是一维数组,而且里边都是基本元素(比如:字符串、数字),那么拷贝后的数组和原来数组数据是相互独立的,修改其中一个数组不会影响原来数组。如果数组是二维数组或者是对象数组,那么拷贝后的数组和原来数组数据不是相互独立的,修改其中一个数组会影响原来数组。

扩展运算符

自从ES6出现以来,这已经成为最流行的方法。它是一个很简单的语法,但是当你在使用类似于React和Redux这类库时,你会发现它是非常非常有用的。

numbers = [1, 2, 3];
numbersCopy = [...numbers];

这个方法不能有效的拷贝多维数组。数组/对象值的拷贝是通过引用而不是值复制。

numbersCopy.push(4);
console.log(numbers, numbersCopy);
// [1, 2, 3] and [1, 2, 3, 4]
// 只修改了我们希望修改的,原数组不受影响
nestedNumbers = [[1], [2]];
numbersCopy = [...nestedNumbers];
numbersCopy[0].push(300);
console.log(nestedNumbers, numbersCopy);
// [[1, 300], [2]]
// [[1, 300], [2]]
// 由于公用引用,所以两个数组都被修改了,这是我们不希望的

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]

同样的,处理对象和数组的时候是引用而不是值复制。

Array.from

可以将任何可迭代对象转换为数组。给一个数组返回一个浅拷贝。

console.log(Array.from('foo'))
// ['f', 'o', 'o']numbers = [1, 2, 3];
numbersCopy = Array.from(numbers)
// [1, 2, 3]

同样的,处理对象和数组的时候是引用而不是值复制。

map

map源于数学,是将一个集合转换成另一种集合,同时保留结构的概念。

在英语中,它意味着Array.map 每次返回相同长度的数组。

numbers = [1, 2, 3];
double = (x) => x * 2;numbers.map(double);

当我们使用map方法时,需要给出一个callback函数用于处理当前的数组,并返回一个新的数组元素。

和拷贝数组有什么关系呢?

当我们想要复制一个数组的时候,只需要在map的callback函数中直接返回原数组的元素即可。

numbers = [1, 2, 3];
numbersCopy = numbers.map((x) => x);

如果你想更数学化一点,(x) => x叫做恒等式。它返回给定的任何参数。

identity = (x) => x;
numbers.map(identity);
// [1, 2, 3]

同样的,处理对象和数组的时候是引用而不是值复制。

slice

slice 方法根据我们指定的start、end的index从原数组中返回一个浅拷贝的数组。

[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]

同样的,处理对象和数组的时候是引用而不是值复制。

filter

Array.filter方法同样会返回一个新数组,但是并不一定是返回同样长度的,这和我们的过滤条件有关。

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

当我们的过滤条件总是true时,就可以用来实现拷贝。

numbers = [1, 2, 3];
numbersCopy = numbers.filter(() => true);
// [1, 2, 3]

同样的,处理对象和数组的时候是引用而不是值复制。

reduce

其实用reduce来拷贝数组并没有展示出它的实际功能,但是我们还是要将其能够拷贝数组的能力说一下的

numbers = [1, 2, 3];
numbersCopy = numbers.reduce((newArray, element) => {newArray.push(element);return newArray;
}, []);

reduce() 方法对数组中的每个元素执行一个由您提供的reducer函数,将其结果汇总为单个返回值。

上面我们的例子中初始值是一个空数组,我们在遍历原数组的时候来填充这个空数组。该数组必须要从下一个迭代函数的执行后被返回出来。

同样的,处理对象和数组的时候是引用而不是值复制。

JS--拷贝数组的方法(浅拷贝)相关推荐

  1. php 合并数组对象,JS内数组合并方法与对象合并实现步骤详解

    这次给大家带来JS内数组合并方法与对象合并实现步骤详解,JS内数组合并方法与对象合并实现的注意事项有哪些,下面就是实战案例,一起来看一下. 1 数组合并 1.1 concat 方法var a=[1,2 ...

  2. 请尽可能说出js中数组的方法,最少3个,越多越好

    我接下来要把数组方法全都过一遍,顺手做个整理. 至于为什么整理这个,最近总听说面试经常会问到这个问题, 面试官灵魂发问:请尽可能说出js中数组的方法,最少3个,越多越好 据可靠消息了解到,如果你回答的 ...

  3. js中数组map方法的使用和实现

    js中数组map方法的使用和实现 MDN中定义 map() 方法创建一个新数组,其结果是该数组中的每个元素是调用一次提供的函数后的返回值. 语法 var new_array = arr.map(fun ...

  4. js中数组indexOf方法的使用和实现

    js中数组indexOf方法的使用和实现 IndexOf方法定义 indexOf()方法返回在数组中可以找到一个给定元素的第一个索引,如果不存在,则返回-1. IndexOf方法语法 arr.inde ...

  5. JavaScript中十种一步拷贝数组的方法

    JavaScript中我们经常会遇到拷贝数组的场景,但是都有哪些方式能够来实现呢,我们不妨来梳理一下. 1.扩展运算符(浅拷贝) 自从ES6出现以来,这已经成为最流行的方法.它是一个很简单的语法,但是 ...

  6. JavaScript中十个一步拷贝数组的方法

    JavaScript中我们经常会遇到拷贝数组的场景,但是都有哪些方式能够来实现呢,我们不妨来梳理一下. 1.扩展运算符(浅拷贝) 自从ES6出现以来,这已经成为最流行的方法.它是一个很简单的语法,但是 ...

  7. JS中数组迭代方法(JavaScript从入门到疯癫)

    数组迭代的方法包含了以下七个( map,filter,forEach,some,every, findIndex,reduce) 目录 1.map 2.filter 3.foreach 4.数组som ...

  8. js删除数组元素方法 总结

    方法一:delete arr[x] 用delete删除后,数组的长度length不会发生变化,此时arr[x]变为undefined. 好处:delete arr[x]后数组的索引保持不变. var ...

  9. js常用数组字符串方法整理

    tips: 在js中基本涉及到区间的都是包头不包尾,如果是删除操作返回值一般为删除内容,关于查找的方法有一定的区别注意使用情况,另外一些可以配合正则表达式的方法也要留意 Array实例的所有方法 co ...

  10. 浅谈JS的数组遍历方法

    用过Underscore的朋友都知道,它对数组(集合)的遍历有着非常完善的API可以调用的,_.each()就是其中一个.下面就是一个简单的例子: var arr = [1, 2, 3, 4, 5]; ...

最新文章

  1. 浙二大数据朱继红_快看!浙经贸2020级新生趣味大数据来咯!
  2. 【星球知识卡片】模型蒸馏的核心技术点有哪些,如何对其进行长期深入学习...
  3. 内功重修之数据结构----数组
  4. C#实现所有经典排序算法汇总
  5. 非阻塞connect
  6. 十大经典排序算法(动图演示,收藏好文)
  7. 判断Python输入是否为数字
  8. ps3存档是php文件,PS3存档修改图文详细全教程
  9. (转载)Hadoop map reduce 过程获取环境变量
  10. Service与Android系统实现(1)-- 应用程序里的Service
  11. 7台不同配置M1 MacBook Pro真实测试
  12. 通过名称识别和处理弹出窗口
  13. 在百度上搜不到的资源是在哪找的?就在这些强大的资源搜索网站呀
  14. MT2503处理器性能介绍,MT2503/MT2503A/MT2503D芯片资料下载
  15. 怎样实现WhatsApp多开?
  16. TP6 + Layui实现无限极分类
  17. QIIME 2:可重复、交互和扩展的微生物组数据分析流程
  18. Ionic之button标签ng-click无反应解决
  19. 计算机CD_ROM表示中文,CD-ROM是指什么?
  20. RangingTool 覆盖物文案国际化

热门文章

  1. Spring A.S - SQL引擎使用说明
  2. 蓝桥杯-奖学金-python
  3. Linux学习-修复win7下安装centos7双系统后,没有win7启动项
  4. nginx 配置ssl
  5. c语言double数据存储形式,C语言 float、double数据在内存中的存储方式
  6. i5 10500配什么主板
  7. commons-logging 源码之 log4j 集成
  8. 路由器wds桥接方法-解决开发板、windows、ubuntu互ping问题
  9. 公众号修改用户分组-php开发微信公众号
  10. 105-为什么会有两种形式的消电离层组合