js實現一個數組的splice
阿新 • • 發佈:2020-07-23
先來了解splice的用法
array.splice(start,deleteCount,item...)
splice方法從array中移除一個多個元素(會對原資料進行修改,而slice不會),並用新的item替換它們。引數start是從陣列array移除元素的開始位置。引數deleteCount是要移除的個數(start,deleteCount必填)。如果有額外的引數,那些item會插入到被移除元素的位置上。它返回一個包含被移除元素的陣列。
例子:
var a = [1,2,3,4,5,6,8]; a.splice(1,2);
start引數為1,deleteCount引數為2。那麼a陣列中下標為1的元素往後移除2個。
結果如下:
如果start引數大於陣列的長度,不會進行移除操作。
如果start引數小於0的話,那麼就會把start和陣列的長度進行相加。
例子:
var a = [1,2,3,4,5,6,8]; a.splice(-4,2);
-4+7 = 3,start變成了3
結果如下:
程式碼如下:
var a = [1,2,3,4,5,6,8]; a.splice(-4,2); console.log(a); Function.prototype.method= function(name,func){this.prototype[name] = func; return this; } Array.method('splice',function(start,deleteCount){ var max = Math.max, min = Math.min, delta, element, insertCount = max(arguments.length - 2,0);//除了start和deleteCount兩個引數外,其他引數的長度k = 0; len = this.length, new_len = 0, result = [], shift_count = 0; start = start || 0; if(start < 0){//小於0把start和陣列長度進行相加 start += len; } start = max(min(start,len),0);//如果start執行了上面的判斷,但是還是小於0,那麼start最小值就是0,如果start大於陣列的長度,start就為陣列的長度 deleteCount = max(min(typeof deleteCount === 'number' ? deleteCount:len,len - start),0);//這邊就是控制deleteCount的值的範圍,比0小那麼就為0,最陣列的長度還大,那麼就為陣列的長度和start引數的差值。 delta = insertCount - deleteCount;//用來判斷item元素的個數是否小於deleteCount的個數 new_len = len + delta;//改變後的陣列的長度 while(k < deleteCount){ element = this[start + k]; if(element !== undefined){ result[k] = element;//獲取要刪除的元素 } k += 1; } shift_count = len - start - deleteCount;//陣列要移動的個數 if(delta < 0){ k = start + insertCount;//既然item元素的值比deleteCount的值少,那麼就直接給k賦值為需要移動的下標 while(shift_count){ this[k] = this[k - delta]; k += 1; shift_count -= 1; } this.length = new_len; }else if(delta > 0){//如果insertCount比deleteCount大的話,那麼 k = 1; while(shift_count){ this[new_len - k] = this[len - k]; k += 1; shift_count -= 1; } this.length = new_len; } for(k = 0; k < insertCount; k += 1){ this[start + k] = arguments[k + 2];//給已刪除的元素賦值 } return result; });
程式執行如下:
第一種情況delta<0
第二種情況delta>0
最後一種情況delta==0