一句话总结:
数组为连续且有序的数据结构,
所以若根据下标查找则很快,index[i]一步到位就可实现查询,若遍历查找则很慢(相对而言);
而插入和删除,除了数组末尾的增删很快,其它处则很慢,因为若数组某处要插入或删除一截,当前位置之后的所有元素都会受影响,都必须一个一个地从原来的位置挪动,而数组末尾的增删则不影响其它元素。
常见时间复杂度:
数组常见API(增删改查操作)
增
下面前三种是对原数组产生影响的增添方法,第四种则不会对原数组产生影响
- push() 快,数组末尾操作,时间复杂度O(1)
- unshift() 慢,数组头位置操作,时间复杂度O(n)
- splice() 慢,数组不定位置操作,时间复杂度O(n)
- concat() 慢,数组末尾操作,但需要逐个加入数据,时间复杂度O(n)
push()
语法:array.push(item1, item2, ..., itemX)
push()方法接收任意数量的参数,并将它们添加到数组末尾,返回数组的最新长度
unshift()
语法:array.unshift(item1,item2, ..., itemX)
unshift()在数组开头添加任意多个值,然后返回新的数组长度
splice()
语法:array.splice(index,howmany,item1,.....,itemX)
传入三个参数,分别是开始位置、0(要删除的元素数量)、插入的元素,返回空数组
concat()
语法:array1.concat(array2,array3,...,arrayX)
首先会创建一个当前数组的副本,然后再把它的参数中的元素逐个添加到副本末尾,所以时间复杂度为O(n),最后返回这个新构建的数组,不会影响原始数组。当 concat() 方法只有一个参数且参数为一个空数组时,它的时间复杂度为 O(1),因为它只需要返回一个新的空数组,在其他情况下,它的时间复杂度都为 O(n)。
删
前三种都会影响原数组,最后一项不影响原数组:
- pop() 快,数组末尾操作,时间复杂度O(1)
- shift() 慢,数组头位置操作,时间复杂度O(n)
- splice() 慢,数组不定位置操作,时间复杂度O(n)
- slice() 慢,根据数组下标操作且不影响原数组,但要遍历切片,时间复杂度O(n)
pop()
语法:array.pop()
pop() 方法用于删除数组的最后一项,同时减少数组的 length 值,返回被删除的项
shift()
语法:array.shift()
shift()方法用于删除数组的第一项,同时减少数组的 length 值,返回被删除的项
splice()
语法:array.splice(index,howmany,item1,.....,itemX)
传入两个参数,分别是开始位置,删除元素的数量,返回包含删除元素的数组
slice()
语法:array.slice(start, end)
用于创建一个包含原有数组中一个或多个元素的新数组,不会影响原始数组,返回切出来的数组。在实现上,slice() 方法使用指定的起始索引和结束索引从原数组中提取部分元素,然后将这些元素组成一个新数组并返回。在计算切片后新数组的长度时,对于起始索引和结束索引之间的元素,都需要进行一次遍历,这部分操作的时间复杂度为 O(k),其中 k 是切片后新数组的长度。因此,slice() 方法的时间复杂度为 O(n)。
改
splice() 慢,数组不定位置操作,时间复杂度O(n)
语法:array.splice(index,howmany,item1,.....,itemX)
传入三个参数,分别是开始位置,要删除元素的数量,要插入的任意多个元素,返回删除元素的数组,对原数组产生影响
查(index[i]根据下标查找很快)
- indexOf() 慢,通过遍历数组查找,时间复杂度O(n)
- includes() 慢,通过遍历数组查找,时间复杂度O(n)
- find() 慢,通过遍历数组查找,时间复杂度O(n)
indexOf()
语法:array.indexOf(item,start)
返回要查找的元素在数组中的位置,如果没找到则返回-1
includes()
语法:array.includes(item,start)
返回要查找的元素是否在数组中,找到返回true,否则false
find()
语法:array.find(function(currentValue, index, arr),thisValue)
返回第一个匹配的元素