數組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),參數是非數組的場景沒有處理哈
相關文章
相關標籤/搜索