javascript使用 concat 方法对数组进行合并的方法


Posted in Javascript onSeptember 08, 2016

在介绍前,抛出一个问题:如何将多个数组合并为一个数组?

以下的分享会分为如下小节:

1.concat方法的基础介绍

2.从实例中感受concat方法

1.concat方法的基础介绍

concat方法用于多个数组的合并。它将新数组的成员,添加到原数组的尾部,然后返回一个新数组,原数组不变。

console.log([].concat([1],[2],[3])); // [1, 2, 3]
console.log([].concat([[1],[2],[3]])); // [[1], [2], [3]]
console.log([].concat(4,[[5,6],[7]])); // [4, [5, 6], [7]]

上面代码中,第一个返回值是将一个空数组与三个数组[1],[2],[3]合并为一个数组,因此返回了[1, 2, 3]。第二个是将一个空数组与一个二维数组合并,二维数组的成员为[1],[2],[3],因此返回了[[1], [2], [3]],注意,返回的是二维数组。第三个例子同理。这里对概念的理解很重要,即将新数组的成员,添加到原数组的尾部。

除了接受数组作为参数,concat也可以接受其他类型的值作为参数。它们会作为新的元素,添加数组尾部。

console.log([].concat(1,2,3)); //[1,2,3];
//等同于
console.log([].concat(1,[2,3])); //[1,2,3];
console.log([].concat([1],[2,3])); //[1,2,3];

这里虽然内容较少,看起来挺简单。但是真正理解起来真的不容易。

2.从实例中感受concat方法

说完基础的知识,给大家看看我最近遇到的一个题目。原题是这样的。

javascript使用 concat 方法对数组进行合并的方法

看例子就能明白是什么意思了。

这道题目中,其中一个解决方案就是:

var flatten = function (arr){
return [].concat.apply([],arr);
};

这一段简单的函数就可以实现将数组中的元素合并的功能。但是当我在理解这个返回值的时候,出现了一个问题。

问题:为什么使用apply方法和没有使用apply方法会有区别?

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

 上面代码中,同样是在一个空数组中向尾部添加新数组,第一个返回的是[1,2,3]。第二个却是一个二维数组。

经过一段时间的折腾,终于理解了其中不同的原因所在。

首先,我们在空数组中调用实例方法concat的时候,是传入concat中的参数,在push到数组的末尾。也就是说,会将空数组与传入的数组的最外层数组进行合并,然后返回一个新数组。

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

上面代码中,从几个数组,到一维数组,二维数组,三维数组逐渐变化的。

在Javascript中call,apply,bind方法的详解与总结 文章中,有提到 apply方法的作用与call方法类似,也是改变this指向(函数执行时所在的作用域),然后在指定的作用域中,调用该函数。同时也会立即执行该函数。唯一的区别就是,它接收一个数组作为函数执行时的参数。

apply方法的第一个参数也是this所要指向的那个对象,如果设为null或undefined或者this,则等同于指定全局对象。第二个参数则是一个数组,该数组的所有成员依次作为参数,在调用时传入原函数。原函数的参数,在call方法中必须一个个添加,但是在apply方法中,必须以数组形式添加。

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

从代码可以看出,第一段代码是先在空数组上先调用了concat方法,该方法的作用是将新数组的成员,添加到原数组的尾部。再调用了apply方法,传入第一个参数,指定对象执行时所在的作用域,而第二个参数的作用是将数组中的所有成员一次作为参数,在调用时传入数组中。

因此,在concat,apply方法同时使用的时候,两个方法的作用会叠加,也就出现了与单独使用concat不同的现象。看个例子。

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

上面代码中,concat方法将最数组合并,然后在合并的基础上在对下一层数组进行合并。

console.log([].concat.apply([],[[1],[2],[3]]));//[1, 2, 3]
//相当于
console.log([].concat(1,2,3)); //[1,2,3]

  总结:

1.单独使用concat方法时,会将新数组的成员,添加到原数组的尾部。

2.使用apply方法来指定concat方法的this指向时,会让两个方法的作用叠加。

3.数组元素合并的方法:

var flatten = function (arr){
return [].concat.apply([],arr);
}; 
var flatten = function (array){
return array.reduce(function(a,b){
return a.concat(b);
},[])
}

以上所述是小编给大家介绍的javascript使用 concat 方法对数组进行合并的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
JQuery插件fancybox无法在弹出层使用左右键的解决办法
Dec 25 Javascript
location.href用法总结(最主要的)
Dec 27 Javascript
让jQuery Mobile不显示讨厌loading界面的方法
Feb 19 Javascript
使用JavaScript链式编程实现模拟Jquery函数
Dec 21 Javascript
如何防止INPUT按回车自动提交表单FORM
Dec 06 Javascript
angular实现表单验证及提交功能
Feb 01 Javascript
Bootstrap modal 多弹窗之叠加引起的滚动条遮罩阴影问题
Feb 27 Javascript
Express + Node.js实现登录拦截器的实例代码
Jul 01 Javascript
详解JS构造函数中this和return
Sep 16 Javascript
jQuery动态操作表单示例【基于table表格】
Dec 06 jQuery
详解微信小程序开发用户授权登陆
Apr 24 Javascript
javascript实现移动端轮播图
Dec 09 Javascript
jQuery插入节点和移动节点用法示例(insertAfter、insertBefore方法)
Sep 08 #Javascript
jQuery删除节点用法示例(remove方法)
Sep 08 #Javascript
jQuery复制节点用法示例(clone方法)
Sep 08 #Javascript
jQuery替换节点用法示例(使用replaceWith方法)
Sep 08 #Javascript
jQuery元素属性操作实例(设置、获取及删除元素属性)
Sep 08 #Javascript
jquery注册文本框获取焦点清空,失去焦点赋值的简单实例
Sep 08 #Javascript
jQuery常用样式操作实例分析(获取、设置、追加、删除、判断等)
Sep 08 #Javascript
You might like
浅谈php中mysql与mysqli的区别分析
2013/06/10 PHP
PHP实现读取一个1G的文件大小
2013/08/24 PHP
ThinkPHP有变量的where条件分页实例
2014/11/03 PHP
PHP基于DOMDocument解析和生成xml的方法分析
2017/07/17 PHP
javascript实现动态CSS换肤技术的脚本
2007/06/29 Javascript
javascript 无提示关闭窗口脚本
2009/08/17 Javascript
JavaScript 类的定义和引用 JavaScript高级培训 自定义对象
2010/04/27 Javascript
JavaScript中的apply()方法和call()方法使用介绍
2012/07/25 Javascript
ko knockoutjs动态属性绑定技巧应用
2012/11/14 Javascript
点击按钮或链接不跳转只刷新页面的脚本整理
2013/10/22 Javascript
JavaScript使用concat连接数组的方法
2015/04/06 Javascript
在Vue中使用echarts的实例代码(3种图)
2017/07/10 Javascript
Bootstrap Table 在指定列中添加下拉框控件并获取所选值
2017/07/31 Javascript
微信小程序实现刷脸登录
2018/05/25 Javascript
[01:03:38]2014 DOTA2国际邀请赛中国区预选赛5.21 CNB VS CIS
2014/05/22 DOTA
[04:16]DOTA2全国高校联赛16强抽签
2018/05/02 DOTA
[36:20]完美世界DOTA2联赛PWL S3 access vs Rebirth 第一场 12.17
2020/12/18 DOTA
让python的Cookie.py模块支持冒号做key的方法
2010/12/28 Python
Python全局变量操作详解
2015/04/14 Python
python获取本机mac地址和ip地址的方法
2015/04/29 Python
Python的Django框架中的Context使用
2015/07/15 Python
Python的socket模块源码中的一些实现要点分析
2016/06/06 Python
解决Python print输出不换行没空格的问题
2018/11/14 Python
Python shutil模块用法实例分析
2019/10/02 Python
python os.path.isfile()因参数问题判断错误的解决
2019/11/29 Python
如何通过python实现人脸识别验证
2020/01/17 Python
python中68个内置函数的总结与介绍
2020/02/24 Python
Python绘制组合图的示例
2020/09/18 Python
Python经典五人分鱼实例讲解
2021/01/04 Python
Antler英国官网:购买安特丽行李箱、拉杆箱
2019/08/25 全球购物
财务经理岗位职责
2013/11/09 职场文书
学雷锋志愿者活动总结
2014/06/27 职场文书
领导班子作风建设年个人整改措施
2014/09/29 职场文书
新闻稿标题
2015/07/18 职场文书
读《解忧杂货店》有感:请相信一切都是最好的安排
2019/11/07 职场文书
python用海龟绘图写贪吃蛇游戏
2021/06/18 Python