zoukankan      html  css  js  c++  java
  • 对js数组的splice实现

    splice是javascript一个自带的数组方法,该方法的主要是用来删除数组中的元素

      start  : 要删除的第一个元素的下标

      deleteCount : 要删除的元素的个数

      如果后面还有参数,则被认为是要替换被删除的元素,不可以是数组,只能是一个个单个的元素

    Array.prototype.splice = function(start,deleteCount){
    
    	var max = Math.max,
    		min = Math.min,
    		delta,
    		element,
    		insertCount = max(arguments.length - 2,0),	//插入的元素的个数,最小为0
    		k = 0,
    		len = this.length,
    		new_len,
    		result = [],	//返回的数组,包函了被删除的元素
    		shift_count;
    
    	start = start || 0;	//如何start不存在,则从0开始
    	if(start < 0){
    		start += len;	//确保start为正数
    	}
    	start = max(min(start,len),0); //确保start为正数
    	deleteCount = max(min(typeof deleteCount === 'number' ? deleteCount : len,len-start),0);	//要删除元素的个数
    	//	1.如果deleteCount存在则deleteCount,否则len
    	//  2.用1的结果与len-start对比,取较小者(因为最大可删除的元素个数为len-start)
    	//  3.用2的结果与0比对,取大者,防止为负数
    	delta = insertCount - deleteCount;		
    	alert(delta);
    	/*
    	 * 1.如果delta大于0,说明数组长度会增加
    	 * 2.如果delat小于0,说明数组长度会减少
    	 */
    	new_len = len + delta;	//数组的新长度
    	while(k < deleteCount){		//这个while循环的作用是保存要返回的result,即保存被删除的元素
    		element = this[start + k];
    		if(element != undefined){
    			result[k] = element;
    		}
    		k++;
    	}
    	shift_count = len - start - deleteCount;	
    	/*
    	 * 1. len-start ,start前端的元素不用动
    	 * 2. 用1的结果再减去deleteCount,是start后面要保留的元素的个数
    	 * 3. 通过shift_count次的遍历,就可以把要保留的元素向前移动,达到删除的目的
    	 */
    	if(delta <= 0){	//在数组长度减少的情况下
    		k = start + insertCount;	//k的初始下标为要保留的元素新的开始下标
    		while(shift_count){
    			this[k] = this[k - delta];	//后面的替换前面的要删除的元素
    			k += 1;
    			shift_count -= 1;
    		}
    		this.length = new_len;
    	}else if(delta > 0){	//在数组长度增加的情况下
    		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;
    };
    

      

  • 相关阅读:
    360给腾讯造的盗梦空间
    C 语言 运算符优先级
    CorelDraw, Adobe Illustrator 转换到 Photoshop 形状路径
    用户体验经典解释
    禁用Windows XP的自动播放功能
    ObjectiveC ARC下的内存管理(一)
    ARC下的内存管理(二)对象及成员的引用关系
    天天撞墙
    PS: 操作不实时显示的解决办法
    摩托罗拉 Milestone新手刷机教程
  • 原文地址:https://www.cnblogs.com/jsmiao/p/4626429.html
Copyright © 2011-2022 走看看