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

 更新时间:2016年09月08日 14:09:30   作者:Uncle-Keith  
这篇文章主要介绍了javascript使用 concat 方法对数组进行合并的方法,本文介绍的非常详细,具有参考借鉴价值,需要的朋友一起看看吧

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

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

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方法

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

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

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

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 方法对数组进行合并的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • JS设置下拉列表框当前所选值的方法

    JS设置下拉列表框当前所选值的方法

    这篇文章主要介绍了JS设置下拉列表框当前所选值的方法,涉及JavaScript结合jsp动态设置select下拉列表框的相关技巧,需要的朋友可以参考下
    2015-12-12
  • 利用JS响应式修改vue实现页面的input值

    利用JS响应式修改vue实现页面的input值

    这篇文章主要给大家介绍了关于如何利用JS响应式修改vue实现页面的input值,文中通过示例代码介绍的非常详细,对大家学习或者使用JS具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09
  • 操作按钮悬浮固定在微信小程序底部的实现代码

    操作按钮悬浮固定在微信小程序底部的实现代码

    在一些购物平台经常需要将商品加入购物车,像加入购物车按钮、结算按钮、收货列表添加地址按钮都是按钮悬浮底部的,怎么实现这样的功能呢?下面小编给大家带来了操作按钮悬浮固定在微信小程序底部的实现代码,一起看看吧
    2019-08-08
  • svg插入foreignObject无法响应事件解决

    svg插入foreignObject无法响应事件解决

    这篇文章主要为大家介绍了svg插入foreignObject无法响应事件解决,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • Javascript 调试利器 Firebug使用详解六

    Javascript 调试利器 Firebug使用详解六

    有时候,为了更清楚方便的查看输出信息,我们可能需要将一些调试信息进行分组输出,那么可以使用console.group来对信息进行分组,在组信息输出完成后用console.groupEnd结束分组。
    2009-07-07
  • Javascript 变量作用域 两个可能会被忽略的小特性

    Javascript 变量作用域 两个可能会被忽略的小特性

    关于Javascript,大家肯定都很熟悉啦,对于有编程经验的朋友来说,Javascript很快就能上手,不过关于JS的变量作用域,还是有一点差别的。
    2010-03-03
  • JS数据类型判断的9种方式总结

    JS数据类型判断的9种方式总结

    谈到JS的类型判断大家应该都不陌生,下面这篇文章主要给大家介绍了关于JS数据类型判断的9种方式,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-12-12
  • layui 实现自动选择radio单选框(checked)的方法

    layui 实现自动选择radio单选框(checked)的方法

    今天小编就为大家分享一篇layui 实现自动选择radio单选框(checked)的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-09-09
  • JS对象添加属性和方法的多种方式

    JS对象添加属性和方法的多种方式

    本文介绍了如何使用JavaScript对象添加属性和方法,通过实例演示了如何给对象添加属性,以及如何在对象中定义方法,具有一定的参考价值,感兴趣的可以了解一下
    2023-08-08
  • JavaScript和JQuery的鼠标mouse事件冒泡处理

    JavaScript和JQuery的鼠标mouse事件冒泡处理

    这篇文章主要介绍了JavaScript和JQuery的鼠标mouse事件冒泡处理,本文总结出了mouse事件的一些定论,并分别给出了JavaScript和JQuery测试代码,需要的朋友可以参考下
    2015-06-06

最新评论