>[success] # js 数组 ~~~ 1.读《学习JavaScript数据结构与算法》第三版 ~~~ >[danger] ##### 在数组开头插入元素 O(n) ~~~ 1.js 在数组开头插入元素方法是 -- 'unshift',通过结构数组我们可以知道向前插入的效率 最低,表示为'O(n)',遵循向前插入是最慢的 2.向前插入时候首先要腾出数组里的第一个元素的位置,把所有的元素位置都向右移动, 也就是原来的 a[0] 的值给到现在a[1]的值,但是如果我们写的方法是正序,就会出现,取得值 都是重新改变的值,为了不影响原来的值变化,应该使用倒叙,也就是如果当前数组长度是100 ,他的末尾角标为99,现在将数组首位添加一项,那么数组就应该从100 变成101 即末尾角标 为100,因此可以直接用现数组的长度作为倒叙也就是从100开始,那么现在a[100] 就应该是原来的 a[99] 将这个思路代码化:'可以循环数组中的元素,以数组的长度未开始(因为前插加入后的末尾的角标整好是现' '在数组的长度)开始,将对应的前一个元素(i-1)的值赋给它(i),依次处理,最后把我们想要的值赋给第一个位置(索引 0)' ~~~ * 将这一个过程图像化(书中的图片) ![](https://img.kancloud.cn/f6/ac/f6acad3ec55f90f21ccc19c22e490d5d_471x303.png) ~~~ // 这里使用了倒序,如果正序就出现一个问题,[1,2,3,4] // 改变了原先的数组顺序导致从第一次往后都是错误取值 Array.prototype.insertFirstPosition = function (value) { for(let i=this.length;i>0;i--){ this[i] = this[i-1] } this[0] = value } let list = [1,2,3,4,5] list.insertFirstPosition(-1) console.log(list) ~~~ >[danger] ##### 删除数组开头元素 O(n) ~~~ 1.js 删除数组第一项使用的是 -- 'shift' 2.通过下面代码发现移出第一项,数组因为长度没变的原因,最后一项变成了undefined ~~~ * 将这一个过程图像化(书中的图片) ![](https://img.kancloud.cn/a1/b9/a1b9186a8fc07fcea4be05562df534aa_508x309.png) ~~~ 1.同理删除不能用倒叙,因为会改变前一个值,用正序后发现首位变成了undefined没有删除,做一个方法 专门用来删除所有的undefined ~~~ ~~~ let numbers = [1,2,3,4,5] for(let i=0,len = numbers.length;i<len;i++){ numbers[i] = numbers[i+1] } ~~~ * 改进后的写法增加了一个去除undefined值的方法 ~~~ // 过滤数组中undefined值数据 Array.prototype.reIndex = function(myArray) { const newArray = []; for(let i = 0; i < myArray.length; i++ ) { if (myArray[i] !== undefined) { // console.log(myArray[i]); newArray.push(myArray[i]); } } return newArray; } // 手动移除第一个元素并重新排序 Array.prototype.removeFirstPosition = function() { for (let i = 0; i < this.length; i++) { this[i] = this[i + 1]; } // 生成的新数组最后一位是undefined return this.reIndex(this); }; numbers = numbers.removeFirstPosition(); ~~~