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

作者:Yazeed Bzadough

译者:allen

dcfc5e58af1439661329f797fc1960f8.png

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]

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

总结

嗯,这很有趣

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/504434.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【LeetCode笔记】54. 螺旋矩阵(Java、迭代、递归)

文章目录题目描述思路 & 代码递归迭代更新版 - 递归题目描述 递归和迭代都实现了&#xff0c;递归相对比较好理解&#xff0c;也比较好实现 思路 & 代码 递归 每次都把最外圈的元素跑完一行 or 一列的时候&#xff0c;跑一次结束边界&#xff1a;left > right …

ubuntu boot空间不足_安装 Ubuntu 双系统

在很久以前就想试一试Linux了&#xff0c;一直没有实践。一是觉得太麻烦&#xff0c;二是怕把电脑弄坏。后来实践了一次后发现&#xff0c;其实并没有想象中那么难&#xff0c;这是一个完全独立的系统&#xff0c;与隔壁的Windows半毛钱关系都没有。把引导搞定就不怕了。另外&a…

【LeetCode笔记】112 113. 路径总和 I II(Java、递归、DFS)

文章目录路径总和 I路径总和 II比较简单&#xff0c;就连着一起写了 路径总和 I 注意&#xff1a;一定得走到叶子才算 直接看代码吧&#xff0c;注释也就几行。 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* T…

安装python环境与运行_linux下怎么安装python的运行环境

展开全部 1、2113linux下安装python3 a、 准备编译环境(环境如果不对的5261话&#xff0c;可能遇到各种问题&#xff0c;比如wget无法下4102载1653https链接的文件)1 2 yum groupinstall Development Tools yum install zlib-devel bzip2-devel openssl-devel ncurses-devel2 下…

【LeetCode笔记】437. 路径总和III(Java、双重递归、二叉树)

文章目录题目描述思路 & 代码题目描述 说实话确实比I & II要恶心一点这里直接用双递归秒了&#xff08;今天才发现我是之前先写的III&#xff0c;再写的I & II&#xff09;有前缀和的写法&#xff0c;但是懒得整了 思路 & 代码 和之前不同&#xff0c;这里…

python中break和continue的区别_python中break和continue的区别

原博文 2017-08-01 09:56 − break和continue 1.break 意思为结束循环 例&#xff1a; i 0 while i<10: i1 if i5: #当i5时&#xff0c;结束整个循环 ...030778 相关推荐 2019-12-20 11:37 − 1、break break的使用场景&#xff1a;循环语句和switch-case分支语句。 它的作…

【LeetCode笔记】128. 最长连续序列(Java、哈希表、动态规划)

文章目录题目描述思路 & 代码变式题&#xff1a;返回答案数组更新可恶。。居然碰到了周一面试没撕出最优复杂度的题 题目描述 难点在于时间复杂度O(n)&#xff0c;否则来个sort()还是很轻松的 思路 & 代码 一般来说&#xff0c;时间复杂度可以用空间复杂度来弥补&a…

【LeetCode笔记】148. 排序链表(Java、归并排序、快慢指针、双重递归)

文章目录题目描述思路 & 代码二刷题目描述 难点在于时空复杂度的要求 思路 & 代码 转化成&#xff1a;归并排序 合并两个有序链表 即可利用快慢指针来拆分成两条链表注意&#xff1a;链表的拆分 & 连接时间复杂度O(n * logn)&#xff0c;空间复杂度 O(1) /**…

java substring截取字符串_lt;12gt;深入了解字符串

深入了解字符串完整视频教程&#xff1a;Java轻松入门经典教程[柠檬学院]-学习视频教程-培训课程-腾讯课堂​ke.qq.com字符串主要用于编程&#xff0c;用于概念说明、函数解释、用法详述等&#xff0c;字符串在存储上类似于字符数组&#xff0c;所以它的每一个单元都是可以提取…

【LeetCode笔记】88. 合并两个有序数组(Java、双指针)

文章目录题目描述思路 & 代码更新题目描述 比较简单&#xff0c;直接看思路吧&#xff01; 思路 & 代码 从后往前进行填数即可&#xff08;正确性可以保证&#xff09;时间复杂度 O(n) class Solution {public void merge(int[] nums1, int m, int[] nums2, int n…

thymealf如何实现传单个变量给html_梦回2013,看尤大vue的第一行代码,如何用30行代码实现vue(超简洁,适合初学者)...

非非非标题党&#xff0c;干货预警&#xff01;&#xff01;&#xff01;介绍大家好&#xff0c;我是清池交友 app 开发日记&#xff0c;记录清池交友 app 开发中学习过程和踩坑日记&#xff0c;伪全栈[1]技术栈&#xff1a;前端 js&#xff0c;vue&#xff0c;uniapp&#xff…

【LeetCode笔记】142. 环形链表 II(Java、快慢指针)

文章目录题目描述思路 & 代码更新版三刷 - 再更新题目描述 相对于环形链表&#xff0c;这里要求找到环的起点难点在于 O(1)&#xff0c;否则可以直接哈希表冲 思路 & 代码 找出快慢指针的路程关系&#xff0c;得出结论&#xff08;详见代码注释&#xff09; /*** …

python找出在原图中的位置_Python 通过截图匹配原图中的位置(opencv)实例

安装依赖 1&#xff09;下载安装opencv-2.4.9&#xff0c;并将cv2.pyd拷贝到python安装目录的site-package下 2&#xff09;pip install numpy 3&#xff09;pip install aircv 准备一张原图和截图 原图截图代码 import cv2 import aircv as ac # print circle_center_pos def …

【LeetCode笔记】287. 寻找重复数(Java、快慢指针、原地、链表)

文章目录题目描述思路 & 代码更新题目描述 可以理解成数组版本的 环形链表 II更多详细思路可见以上超链接。 思路 & 代码 如何转化成逻辑上的链表&#xff1f;nums[i] 是 第 i 个结点的 next 指针构造成一个有 nums.length - 重复次数 个结点的链表如此&#xff0…

【LeetCode笔记】338. 比特位计数(Java、位运算、动态规划)

文章目录题目描述思路 & 代码无注释二刷题目描述 难点在于 O(n) 思路 & 代码 理解题意&#xff0c;分析出 O(n) 复杂度应该是要用到之前的值来得到当前值——动态规划核心结论&#xff1a;奇数比前一个数多一个1&#xff0c;偶数和偶数除二后的数的1数量一样边界 &…

【LeetCode笔记】560. 和为K的子数组(Java、前缀和、哈希表)

文章目录题目描述思路 & 代码暴力法 O(n2n^2n2)前缀和 哈希表 O(n)二刷题目描述 第一道前缀和题目&#xff5e; 思路 & 代码 暴力法 O(n2n^2n2) 固定一个值&#xff0c;从后往前找满足的条件即可 class Solution {public int subarraySum(int[] nums, int k) {i…

caffe不支持relu6_国产AI框架再进化!百度Paddle Lite发布:率先支持华为NPU在线编译,全新架构更多硬件支持...

乾明 边策 发自 凹非寺 量子位 报道 | 公众号 QbitAI国产AI框架飞桨刚刚带来新进化&#xff1a;Paddle Lite正式发布&#xff01;高扩展、高性能、轻量化&#xff0c;还是首个支持华为NPU在线编译的深度学习端侧推理框架&#xff0c;剑指加大力度攻占移动端侧场景。而且大环境如…

【LeetCode笔记】1143. 最长公共子序列(Java、动态规划、字符串)

文章目录题目描述思路 & 代码二刷三刷题目描述 算是很高频的面试题了&#xff0c;而且题号还挺后的 思路 & 代码 注意&#xff1a;dp[i]][j] 和 charAt(i) 有1的下标差&#xff08;dp初始化边界&#xff09;核心思想&#xff1a;当前值可构成新的最大子串就左上角值…

【LeetCode笔记】139. 单词拆分(Java、动态规划、字符串、哈希表)

文章目录题目描述思路 & 代码二刷更新题目描述 漏网之题。。一个月前写的居然没写博客 思路 & 代码 HashSet 存储 word&#xff0c;便于查询动态规划三要素在注释中思路&#xff1a;如果dp[j] true且[j1,i]可以组成单词&#xff0c;则dp[i] true class Solution…

mysqlfor循环中出错继续_Python学习笔记(循环)

循环语句1. while 循环while语句最基本的形式包括一个位于顶部的布尔表达式&#xff0c;一个或多个属于while代码块的缩进语句。while 布尔表达式:代码块while循环的代码块会一直循环执行&#xff0c;直到布尔表达式的值为布尔假。如果布尔表达式不带有<、>、、&#xff…