zl程序教程

您现在的位置是:首页 >  其它

当前栏目

Array.prototype.splice()

Array prototype splice
2023-09-11 14:15:02 时间

splice()方法通过删除现有元素和/或添加新元素来更改一个数组的内容。

此方法会改变数组自身。

start

第一个参数start是修改的开始位置。如果超出如果超出了数组的长度,则从数组末尾开始添加内容;如果是负值,则表示从数组末位开始的第几位(从-1计数);若只使用start参数而不使用deleteCount、item,表示删除[start,end]的元素。

deleteCount

整数,表示要移除的数组元素的个数。如果 deleteCount 是 0,则不移除元素。这种情况下,至少应添加一个新元素。如果 deleteCount 大于start 之后的元素的总数,则从 start 后面的元素都将被删除(含第 start 位)。

item1,item2…

要添加进数组的元素,从start 位置开始。如果不指定,则 splice() 将只删除数组元素。

var myFish = ["angel", "clown", "mandarin", "surgeon"]; 
//从第 2 位开始删除 0 个元素,插入 "drum" 
var removed = myFish.splice(2, 0, "drum"); 
//运算后的 myFish:["angel", "clown", "drum", "mandarin", "surgeon"] 
//被删除元素数组:[],没有元素被删除


var myFish = ['angel', 'clown', 'drum', 'mandarin', 'sturgeon'];
var removed = myFish.splice(3, 1);
//运算后的myFish:["angel", "clown", "drum", "sturgeon"]
//被删除元素数组:["mandarin"]


var myFish = ['angel', 'clown', 'drum', 'sturgeon'];
var removed = myFish.splice(2, 1, "trumpet"); 
//运算后的myFish: ["angel", "clown", "trumpet", "surgeon"] 
//被删除元素数组:["drum"]


var myFish = ['angel', 'clown', 'trumpet', 'sturgeon'];
var removed = myFish.splice(0, 2, 'parrot', 'anemone', 'blue');
// 运算后的myFish: ["parrot", "anemone", "blue", "trumpet", "sturgeon"] 
// 被删除元素数组:["angel", "clown"]


var myFish = ['parrot', 'anemone', 'blue', 'trumpet', 'sturgeon'];
var removed = myFish.splice(myFish.length - 3, 2);
// 运算后的myFish: ["parrot", "anemone", "sturgeon"] 
// 被删除元素数组:["blue", "trumpet"]


var myFish = ['angel', 'clown', 'mandarin', 'sturgeon'];
var removed = myFish.splice(2);
// 运算后的myFish :["angel", "clown"] 
// 被删除的元素数组: ["mandarin", "sturgeon"]

实现简单的splice():

Array.prototype.splice = function () {
    var del = [];
    
    if (arguments.length == 0) {
        return del;
    } else if (arguments.length == 1) {
        if (this.length == 0) {
            return del;
        } else {
            var start;
            if (Object.prototype.toString.call(arguments[0]) === '[object Number]' && !isNaN(arguments[0])) {
                start = parseInt(arguments[0]);
                if (start < 0 && Math.abs(start) > this.length) {
                    del = JSON.parse(JSON.stringify(this));
                    this.length = 0;
                    return del;
                } else if (start < 0 && Math.abs(start) < this.length) {
                    start = this.length - 1 - Math.abs(start);
                    for (var i = start; i < this.length; i++) {
                        del.push(JSON.parse(JSON.stringify(this[i])));
                    }
                    this.length = start;
                    return del;
                } else if (start > 0 && start > this.length) {
                    return del;
                } else if (start == 0) {
                    del = JSON.parse(JSON.stringify(this));
                    this.length = 0;
                    return del;
                } else if (start > 0 && start < this.length) {
                    for (var i = start; i < this.length; i++) {
                        del.push(JSON.parse(JSON.stringify(this[i])));
                    }
                    this.length = start;
                    return del;
                }
            } else {
                del = JSON.parse(JSON.stringify(this));
                this.length = 0;
                return del;
            }
        }
    } else if (arguments.length >= 2) {
        var start, deleteCount;
        var items = Array.prototype.slice.call(arguments,2);
        
        if (Object.prototype.toString.call(arguments[0]) === '[object Number]' && !isNaN(arguments[0])) {
            start = parseInt(arguments[0]);
            if (start < 0 && Math.abs(start) > this.length) {
                start = 0;
            }
            if (start < 0 && Math.abs(start) < this.length) {
                start = this.length - 1 - Math.abs(start);
            }
        } else {
            start = 0;
        }
        
        if (Object.prototype.toString.call(arguments[1]) === '[object Number]' && !Number.isNaN(arguments[1])) {
            if (arguments[1] < 0) {
                deleteCount = 0;
            } else {
                deleteCount = parseInt(arguments[1])
            }
        } else {
            deleteCount = 0;
        }

        if (deleteCount > 0 && start < this.length) {
            for (var i = start; i < start + deleteCount; i++) {
                del.push(JSON.parse(JSON.stringify(this[i])))
            }
            var temp = start;
            for (var i = temp + deleteCount; i < this.length; i++ ) {
                this[temp++] = this[i];
            }
            this.length = this.length - deleteCount;
        }
        
        if (arguments.length == 2) {
            return del;
        }
        if (arguments.length > 2) {
            var itemLength = items.length;
            
            if (start >= this.length) {
                for (var i = 0; i < items.length; i++) {
                    this[this.length] = items[i];
                }
            } else if (start < 1) {
                for (var i = items.length - 1; i >= 0; i--) {
                    this.unshift(items[i]);
                }
            } else {
                var arrLength = this.length;
                var temp = start;
                this.length = this.length + itemLength;
                for (var i = arrLength - 1, j = 1; i >= start; i--, j++) {
                    this[this.length - j] = this[i];
                }
                for (var i = 0; i < itemLength; i++) {
                    this[temp++] = items[i];
                }
            }
        }
        return del;
    }
}

 上面实现的splice优化:

Array.prototype.splice = function () {
    var del = [];
    
    if (arguments.length == 0) {
        return del;
    } else if (arguments.length == 1) {
        if (this.length == 0) {
            return del;
        } else {
            var start;
            if (Object.prototype.toString.call(arguments[0]) === '[object Number]' && !(arguments[0] != arguments[0])) {
                start = arguments[0] >> 0;//右移0位取整

                var realStart = start < 0 ?
                    Math.max(this.length + start, 0) :
                    Math.min(start, this.length);

                for (var i = realStart; i < this.length; i++) {
                    del.push(JSON.parse(JSON.stringify(this[i])));
                }

                this.length = realStart;
                return del;
                
            } else {
                del = JSON.parse(JSON.stringify(this));
                this.length = 0;
                return del;
            }
        }
    } else if (arguments.length >= 2) {
        var start, deleteCount, realStart;
        var items = Array.prototype.slice.call(arguments,2);
        
        if (Object.prototype.toString.call(arguments[0]) === '[object Number]' && !(arguments[0] != arguments[0])) {
            start = arguments[0] >> 0;//右移0位取整

            realStart = start < 0 ?
                Math.max(this.length + start, 0) :
                Math.min(start, this.length);
        } else {
            realStart = 0;
        }
        
        if (Object.prototype.toString.call(arguments[1]) === '[object Number]' && !(arguments[0] != arguments[0])) {
            if (arguments[1] < 0) {
                deleteCount = 0;
            } else {
                deleteCount = arguments[1] >> 0;
            }
        } else {
            deleteCount = 0;
        }

        if (deleteCount > 0 && realStart < this.length) {
            for (var i = realStart; i < realStart + deleteCount; i++) {
                del.push(JSON.parse(JSON.stringify(this[i])))
            }
            var temp = realStart;
            for (var i = temp + deleteCount; i < this.length; i++ ) {
                this[temp++] = this[i];
            }
            this.length = this.length - deleteCount;
        }
        
        if (arguments.length == 2) {
            return del;
        }
        
        if (arguments.length > 2) {
            var itemLength = items.length;
            
            if (realStart >= this.length) {
                for (var i = 0; i < items.length; i++) {
                    this[this.length] = items[i];
                }
            } else if (realStart < 1) {
                for (var i = items.length - 1; i >= 0; i--) {
                    this.unshift(items[i]);
                }
            } else {
                var arrLength = this.length;
                var temp = realStart;
                this.length = this.length + itemLength;
                for (var i = arrLength - 1, j = 1; i >= realStart; i--, j++) {
                    this[this.length - j] = this[i];
                }
                for (var i = 0; i < itemLength; i++) {
                    this[temp++] = items[i];
                }
            }
        }
        return del;
    }
}