JavaScript模拟数组合并concat


Posted in Javascript onMarch 06, 2016

定义和用法

concat() 方法用于连接两个或多个数组。

该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本。

语法

arrayObject.concat(arrayX,arrayX,......,arrayX)

参数 描述
arrayX 必需。该参数可以是具体的值,也可以是数组对象。可以是任意多个。
返回值

返回一个新的数组。该数组是通过把所有 arrayX 参数添加到 arrayObject 中生成的。如果要进行 concat() 操作的参数是数组,那么添加的是数组中的元素,而不是数组

我们有两个这样的数组

var arr1 = [1,2,3];
var arr2 = [4,5,6];

任务:合并成这样,请至少提供两种思路。

var arr1 = [1,2,3,4,5,6];

思路一:我们可以把第二个数组里面的值挨个添加到第一个数组的末尾。

1:数组怎么添加内容 ?[] || push || shift

2:怎么向数组最后一个索引添加值? push || [数组.length]

3:怎么挨个向数组一添加内容? for

4: for循环多少次? 你要添加多少就循环多少次,也就是arr2的长度

5: 要添加什么内容?arr2里面的值,怎么获取,arr[?]

代码实现:

var arr1 = [1,2,3];
var arr2 = [4,5,6];
for(var i=0;i<arr2.length;i++){
arr1.push(arr2[i]);
}
console.log(arr1); //[1, 2, 3, 4, 5, 6]

问题来了,原生js提供的concat方法不会修改原数组(arr1)的内容,而是返回一个新数组。

分析:既然是要返回值,那我们可以定义一个函数,然后再定义一个变量,这个变量来接收我们添加好的值,但是我们会一个问题,那就是不能在arr1上面push内容了,不然还是会修改原数组的内容。于是我觉得要把原数组复制一份,但是又有一个问题,就是对象是引用类型,简单来说虽然我们可以把数组1复制到一个变量中,但是如果我用push或者[]的形式修改里面的值,或者添加,那么我们的原数组也会被修改,(如果你不知道什么是引用类型,可以去看我博客的第一页或者在第二页)这不是我们想要的结果,但是我们必须复制一份arr1。此时你有什么解决方法?

解决数组引用问题:

for(var i=0;i<arr1.length;i++){
arr3[i] = arr1[i];
}

我的思路是把数组1的值挨个的添加到arr3这个数组中,此时的arr3是这样的

console.log(arr3) //[1, 2, 3]

任务:在这个新的数组arr3中添加arr2的所以值,方法和第一步一样,如果忘记了回头看看。

代码实现:

var arr1 = [1,2,3];
var arr2 = [4,5,6];
var arr3 = [];
for(var i=0;i<arr1.length;i++){
arr3[i] = arr1[i];
}
for(var i=0;i<arr2.length;i++){
arr3.push(arr2[i]);
}
console.log(arr3);

问题:虽然这个已经实现了数组的合并,但是我每次合并都要重新写一份,那样太麻烦,于是我们得想个办法把它封装成一个函数,下次我们要用的时候调用它就行。

var arr1 = [1,2,3];
var arr2 = [4,5,6,7];
function Concat(arr1,arr2){
var arr3 = [];
for(var i=0;i<arr1.length;i++){
arr3[i] = arr1[i];
}
for(var i=0;i<arr2.length;i++){
arr3.push(arr2[i]);
}
return arr3;
}
console.log(Concat(arr1,arr2));

思路二:

分析:把arr1和arr2都转换成字符串,然后将这两段字符串相加得到一个组合,然后再把这个字符串转成数组。

代码实现:

var arr1 = [1,2,3];
var arr2 = [4,5,6,7,8,9];
var arr3 = (arr1.join(",")+","+arr2.join(",")).split(",");

出了点小问题,这个这个数组里面的值是字符串了。

["1", "2", "3", "4", "5", "6", "7", "8", "9"]

解决思路:遍历这个数组,挨个把他们转换成数字。

var arr1 = [1,2,3];
var arr2 = [4,5,6,7,8,9];
var arr3 = (arr1.join(",")+","+arr2.join(",")).split(",");
for(var i=0;i<arr3.length;i++){
arr3[i] = +arr3[i];
}
console.log(arr3);

课外扩展:继承版

var arr1 = [1,2,3];
var arr2 = [4,5,6,7,8,9];
Array.prototype.Concat = function(arr){
var arr3 = [];
for(var i=0;i<this.length;i++){
arr3[i] = this[i];
}
for(var i=0;i<arr.length;i++){
arr3.push(arr[i]);
}
return arr3;
}
console.log(arr1.Concat(arr2));

以上所述是小编给大家介绍的JavaScript模拟数组合并concat的相关知识,希望对大家有所帮助!

Javascript 相关文章推荐
javascript 基础篇4 window对象,DOM
Mar 14 Javascript
javascript时间自动刷新实现原理与步骤
Jan 06 Javascript
javaScript(JS)替换节点实现思路介绍
Apr 17 Javascript
JavaScript创建类/对象的几种方式概述及实例
May 06 Javascript
JavaScript判断变量是对象还是数组的方法
Aug 28 Javascript
如何使用HTML5地理位置定位功能
Apr 27 Javascript
PHP+jQuery+Ajax+Mysql如何实现发表心情功能
Aug 06 Javascript
基于js实现二级下拉联动
Dec 17 Javascript
原生js二级联动效果
Jun 20 Javascript
vue头部导航动态点击处理方法
Nov 02 Javascript
vue 通过绑定事件获取当前行的id操作
Jul 27 Javascript
vuex管理状态仓库使用详解
Jul 29 Javascript
JavaScript模拟push
Mar 06 #Javascript
JavaScript中利用jQuery绑定事件的几种方式小结
Mar 06 #Javascript
Node.js模块封装及使用方法
Mar 06 #Javascript
JavaScript中三种异步上传文件方式
Mar 06 #Javascript
JavaScript中获取纯正的undefined的方法
Mar 06 #Javascript
JS面向对象编程详解
Mar 06 #Javascript
深入学习JavaScript的AngularJS框架中指令的使用方法
Mar 05 #Javascript
You might like
php中对xml读取的相关函数的介绍一
2008/06/05 PHP
php stripslashes和addslashes的区别
2014/02/03 PHP
ThinkPHP模板判断输出Defined标签用法详解
2014/06/30 PHP
PHP Socket网络操作类定义与用法示例
2017/08/30 PHP
Extjs学习笔记之八 继承和事件基础
2010/01/08 Javascript
JavaScript包装对象使用介绍
2013/08/29 Javascript
JavaScript动态改变HTML页面元素例如添加或删除
2014/08/10 Javascript
JavaScript文本框脚本编写的注意事项
2016/01/25 Javascript
Angularjs中UI Router全攻略
2016/01/29 Javascript
jQuery实现的选择商品飞入文本框动画效果完整实例
2016/08/10 Javascript
原生js实现ajax方法(超简单)
2016/09/20 Javascript
三种方式实现瀑布流布局
2017/02/10 Javascript
AngularJS标签页tab选项卡切换功能经典实例详解
2018/05/16 Javascript
浅谈VUE防抖与节流的最佳解决方案(函数式组件)
2019/05/22 Javascript
layui动态加载多表头的实例
2019/09/05 Javascript
浅谈小程序globalData的那些事儿
2019/11/01 Javascript
Vue中fragment.js使用方法小结
2020/02/17 Javascript
[49:40]2018DOTA2亚洲邀请赛小组赛 A组加赛 TNC vs Newbee
2018/04/03 DOTA
Python中os.path用法分析
2015/01/15 Python
一些Python中的二维数组的操作方法
2015/05/02 Python
Django实现简单分页功能的方法详解
2017/12/05 Python
python决策树之CART分类回归树详解
2017/12/20 Python
使用pandas读取csv文件的指定列方法
2018/04/21 Python
Python 二叉树的层序建立与三种遍历实现详解
2019/07/29 Python
python GUI库图形界面开发之PyQt5美化窗体与控件(异形窗体)实例
2020/02/25 Python
Python基础之字典常见操作经典实例详解
2020/02/26 Python
CSS3中各种颜色属性的使用教程
2016/05/17 HTML / CSS
解释一下抽象方法和抽象类
2016/08/27 面试题
演讲比赛获奖感言
2014/02/02 职场文书
产品委托授权书范本
2014/09/16 职场文书
普通党员个人剖析材料
2014/10/08 职场文书
2015年污水处理厂工作总结
2015/05/26 职场文书
五年级作文之想象作文
2019/10/30 职场文书
总结Python使用过程中的bug
2021/06/18 Python
nginx从安装到配置详细说明(安装,安全配置,防盗链,动静分离,配置 HTTPS,性能优化)
2022/02/12 Servers
springboot为异步任务规划自定义线程池的实现
2022/06/14 Java/Android