Javascript常用的数组方法实现

初识数据结构

数据结构是算法入门基础,可以更快更好的帮我们处理一些程序逻辑上的问题。

之前接触过数据结构,所以有一个大概的印象,但是没怎么刷过题,趁着暑假赶紧回顾,所有代码都是用JavaScript来进行算法描述,今天就开始正式回顾算法了,如果代码中哪里有错误请及时指出,感谢。

文章目录

    • 初识数据结构
    • 数组
      • array.push()和array.unshift()
      • array.pop()和array.shift()
      • splice和concat

数组

js为我们对数组的操作提供了很多内置方法

array.push()和array.unshift()

参数:参数为向数组中添加的内容,可以为一个或多个,不限制类型

结果:push向数组末尾添加元素,unshift向数组头部添加元素,都会改变原数组

返回值:数组添加完之后的长度

如何实现?

思路:

①push的实现将数组的长度当作索引,之后进行赋值

Array.prototype.myPush = function(){
	for(let i=0;i<arguments.length;i++){
       this[this.length] = arguments[i];
   }
    return this.length
}

②unshift需要在数组的头部添加一个或多个,所以需要将后面的其它元素都向后移一位

Array.prototype.myUnshift = function() {
    //unshift的实现需要两步
    //第一步将原数组中的所有元素向有移动(距离为添加的内容长度)
    //第二步将添加的内容依次放入之前按的空位中
	let num = arguments.length;
    for( let i = 0; i < num; i++ ){
      this[i+num] = this[i];
    }
    for( let j = 0; j < num ; j++){
      this[j] = arguments[j];
    }
    return this.length
}

array.pop()和array.shift()

pop方法删除数组的最后一个元素,返回值为被删除的元素,会改变原数组

shift方法删除数组的最后一个元素,返回值为被删除的元素,会改变原数组

这两个方法都不接收参数,返回值为被删除的元素

实现方法:

 // pop的实现
        Array.prototype.myPop = function () {
            let tailEle = this[this.length - 1];
            this.length--;
            return tailEle;
        }
//shift的实现 
//先将所有元素向前移动一位,再将length-1
Array.prototype.myShift = function () {
            let headEle = this[0];
            for (let i = 1; i < this.length; i++) {
                this[i - 1] = this[i]
            }
            this.length--;
            return headEle;
        }

splice和concat

splice和concat都可以返回一个新数组

splice的功能非常大,可以删除指定位置的数组元素,也可以向指定位置添加数组元素,使用该方法会改变原数组

参数 描述
index 必需。整数,规定添加或者删除的位置,支持以负数为索引,为负数则表示从末尾开始
howmany 必需。需要删除的项目数量,设置为0则不会删除元素
item,…,itemX 可选,添加的具体元素

返回值为数组,如果是删除的有元素,则数组中内容为删除的元素,其它情况数组都是空数组。

let arr = [1,2,3,4,5]
//添加元素
let result = arr.splice(1,0,4444,5555)
console.log(arr)
console.log(result)
//arr:1,4444,5555,2,3,4,5
//result: []

//删除元素
let result2 = arr.splice(1,2)
console.log(arr)
console.log(result2)
//arr:1,2,3,4,5
//result:[4444,5555]

splice的实现:

 <script>
        function mySplice(index, howmany, ...items) {

            // 先做类型判断,确保输入的都为数字
            if (typeof index !== 'number' || typeof howmany !== 'number') {
                console.log('请检查输入的类型');
                return;
            }
            //剩余参数的数组长度
            let len = items.length;
            // 执行删除操作,将范围内的元素删除,也就是将后面的向前移动
            if (howmany !== 0) {
                // 用于保存返回值的数组
                let result = [];
                // 将删除的元素保存到数组中,后续作为返回值
                for (let i = index; i < index + howmany; i++) {
                    result[result.length] = this[i];
                }
                // 从删除的最后一个位置的下一位开始到原数组末尾,依次向前移动howmany个位置
                for (let m = index + howmany; m < this.length; m++) {
                    this[index++] = this[m];
                }
                //将数组的长度删除删除howmany个长度,
                this.length = this.length - howmany;
                return result
            }
            // 添加元素
            if (howmany === 0 && len > 0) {
                // 说明此时是在指定位置添加元素
                // 将数组索引为index的位置向后移动howmany的值,并将items添加进去
                //需要注意的是应该从数组的最后开始移动,否则可能会出现赋值错误的情况

                //还是分为两步,第一步将数组拆分,需要移动的向后移动
                for (let j = this.length - 1; j >= index; j--) {
                    this[j + len] = this[j];
                }
                for (let k = 0; k < len; k++) {

                    this[index++] = items[k];
                }
                // 数组长度自己会增加
                //返回值为空
                return []
            }
        }
        Array.prototype.mySplice = mySplice;
        let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
        // let result = arr.mySplice(1, 3)
        let result2 = arr.mySplice(2, 0, 44, 44)
        console.log(result2);
        console.log(arr);
    </script>

cnocat的实现:


你可能感兴趣的:(javascript,前端)