• js实现一个数组的splice


    先来了解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

  • 相关阅读:
    管理页面的类 PageHelper
    接下来打算写一下visual stuido 2013使用git进行远端管理。
    转一下网上找来的tortoise git不用每次都输入邮箱和密码的方法。备查看
    tortoise git使用 git版本库的rsa key来进行ssh连接
    2015年4月1日 14:36:56 EF 主从表更新
    Oop分析方法
    Knative 实战:基于 Knative Serverless 技术实现天气服务-下篇
    超大规模商用 K8s 场景下,阿里巴巴如何动态解决容器资源的按需分配问题?
    从零开始入门 K8s | 可观测性:你的应用健康吗?
    Knative 暂时不会捐给任何基金会 | 云原生生态周报 Vol. 22
  • 原文地址:https://www.cnblogs.com/MySweetheart/p/13357683.html
Copyright © 2020-2023  润新知