牛骨文教育服务平台(让学习变的简单)
博文笔记

Array.prototype.splice方法重写

创建时间:2016-12-15 投稿人: 浏览次数:1299

在JavaScript的数组操作API中,Array.prototype.splice是一个很强大的方法。

假如要你来重写一个这样的方法,该如何考虑呢?

先来看一下,这个方法的原型。

Array.prototype.splice(from, count, insertItems...)

这个方法接收两个或更多的参数,它拥有如下的性质:

1.from参数是一个大于等于0的正整数,它决定了从哪个索引开始对数组进行操作

2.count参数也是一个大于等于0的正整数,它表示从from索引开始要移除多少个元素

3.insertItems代表任意项要被插入from位置的元素

4.该方法应该返回一个数组,该数组包含所有被移除的元素,若没有元素被移除,则返回空数组

根据这些性质,我们可以划分为2个基本业务:

1.删除操作,如果count>=0,那么就执行该操作。

2.新增操作,如果insertItems至少有一项,那么就执行该操作。

写成下面的代码实现:

Array.prototype.splice = function (from, count) {
	//存放移除的数组元素
    var del = [];
    if(count >= 0){
		//如果没有足够的元素可供删除
		//就删除从from开始的所有元素
        if(count > this.length - from){
            count = this.length - from;
        }
		//要被删除的最后一个元素索引
        var end = from + count - 1;
		//从后往前删
        for(var i=end;i>=from;i--){
            del.unshift(this[i]);
			//移位
            for(var j=i;j<this.length-1;j++){
                this[j] = this[j+1];
            }
			//长度-1并且将最后一个元素舍弃
            this.length--;
        }
    }
	//获取要添加的项
    var toAdd = Array.prototype.slice.call(arguments,2);
	//从后往前添加
    for(var i=toAdd.length-1;i>=0;i--){
		//为新元素移开位置
        for(var j=this.length-1;j>=from;j--){
            this[j+1] = this[j];
        }
		//将新元素插入指定的位置
        this[from] = toAdd[i];
    }
    return del;
};


声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。