数组concat方法是如何实现的呢?

输入输出

var arr = [1].concat[2]; 
//返回值arr就是[1,2]
复制代码

定义和用法

concat() 方法用于链接两个或多个数组。 该方法不会改变现有的数组, *** 返回值是被链接数组的一个副本 ***数组

arrayObject.concat(arrayX,arrayX,......,arrayX)
复制代码

分析

js原生的concat是在链接数组的时候只会铺平一级数组, 好比:ui

var arr = [1].concat[2]; 
//返回值arr就是[1,2]
复制代码
//若是链接的数组是大于一维的数组,那么,从二维开始,按照原样链接
var arr1=[1];

var arr2 = arr1.concat([2,[3],4,[5]]);
console.log(arr1,arr2)
//[1] [1,2,[3],4,[5]]
复制代码

实现一 (经典的for循环)

Array.prototype._concat = function() {
            var arr = JSON.parse(JSON.stringify(this)); // 用JSON能够深度拷贝数组
            //var arr=this.slice(0)//用slice能实现浅拷贝this数组
            for (var i = 0; i < arguments.length; i++) {
                var argo = arguments[i]; 
                for ( var j = 0; j < argo.length; j++ ) {
                    arr.push(argo[j]);
                }
            };
            return arr;
        }
        var arr1 = [1,2,3], arr2 = ['a','b','c'];
       
      
 arr1._concat(arr2) //[1, 2, 3, "a", "b", "c"]
复制代码

实现二

只是不用for循环,换了map而已,代码更简洁 此方法增长了参数是非数组的处理this

Array.prototype._concat = function(){
	var arr = JSON.parse(JSON.stringify(this));
	var args = [...arguments];
	args.map(item=>{
	    if(Array.isArray(item)){
	        item.map(val=>{
			    arr.push(val)
		    })
	    }else{
	        arr.push(item)
	    }

	});
	return arr;
}
var arr1 = [1,2,3]

var arr2= [4,5,6]

arr1._concat(arr2)
//[1, 2, 3, 4, 5, 6]

arr1._concat(0); // [1,2,3,0]
复制代码

总结:

  • 注意链接数组的层级,大于一级的并不会被铺平
  • concat的返回值才是链接后的数组
  • 数组1.concat(数组2)中,数组1的获取方式须要考虑到多维度的状况。
  • 对于入参是非数组的状况也要考虑
  • 本例中arr.concat(0),参数是非数组的场景没有处理哈
相关文章
相关标签/搜索