JavaScript数组基础

196 阅读8分钟

三 数组

1.定义

  • (1)数组:有序列表存储若干个无序的元素。
  • (2)将元素放在列表中的第几位,从0开始计算,这个位置就是下表,又叫做索引值。
  • (3)元素被存储在列表中,这个数据就时元素,简称元。
  • (4)从列表中获取这个元素的方法: 数组名[下标] 就可以得到这个元素了。
  • (5)数组也是引用类型,引用地址赋值。
  • (6)数组在强转或者隐式转换为字符串时,都会转换为数组的元素连接字符串值。
  • (7)数组与对象的区别: ①对象: 1° 对象是以一种松散型结构,对象是键值对存储。 2°当删除一个元素时,对象其他值不会发生变化。 3°对象是没有元素个数的,也就是对象没有长度。对象中不知道存储了多少个元素,插入和删除不会影响其他数据,所以时间复杂度极低。 4°因为通过key去一一对应存储一个值,所以获取时,只需根据key去取值就可以了,所以时间复杂度低。 5°对于对象来说,因为每个数据都是独立存在的,不存在关联关系,更不能排序,所以不能因关联关系找到对应的值。 ②数组: 1°数组是紧密型结构,只用下标存储对应的值。 2°当删除一个元素时,因为数组时紧密结构,就会将后边的元素向前递进。 3°数组是有长度。数组中可以知道存储了多少元素,因为插入和删除都会影响数组的位置和结构,因此插入和删除都会影响数组的运行效率时间复杂度较高。 4°数组的存储时依靠下标的,所以如果需要查找一个值,就需要遍历数组的每个元素,以找到目标元素,因此时间复杂度也极高。 5°数组在使用时,因为是紧密型结构,我们可以根据上一个内容找到与其相关联的其他元素。 例如我们可以利用数组排序,找到一个最小值,还可以迅速找第二最小值
  • (8) ①[]!==[] ②[]!=[] ③![]==[]④[]=="" ⑤[]==0 ⑥[]==false

2.创建数组

  • (1)字面量创建数组 var arr=[4,5,8,7,9]; var arr=[]; 创建空数组 因为js是弱类语言,因此数组比较随意,可以任意扩张,不需要限定长度,也无法限定长度。
  • (2)构造函数创建法 var arr =new Array(4,5,5,7,9); var arr =new Array(11); 如果构造函数创建数组时,仅有一个参数且这个参数是一个大于等于0的正整数时,这个数就是这个新数组的长度,并且没有长度,如果是负数或者小数,则会报错。如果会非数值,就会将该元素放入数组的第0位。
  • (3)对象创建法 var arr = new Object([7,8,7,6,9]); arr.construtor 构造函数
    Array.isArray(arr) 是否是数组

3.数组长度

arr.length 数组长度,数组中元素的个数。

  • (1)数组的长度是一个可读可写的属性。
  • (2)如果数组的长度修改比原来的长度小,就会把对应多出来的元素删除。
  • (3)①arr.length-- :删除最尾部的一个元素。 ②arr.length=0 :清空数组中所有元素。 ③arr.length++ :在数组尾部添加一个空元素。 ④arr[arr.length]=5; 在数组的尾部添加一个元素5。 ⑤arr[10]=5; 如果数组下标大于数组的长度时,就会在对应下标的位置添加元素,中间添加空元素。 ⑥i in arr : 可以判断对象中这个key对应的值是否存在 在数组中下标就相当于key,可以判断它的对应值是否存在。

4.数组的遍历

  • (1)数组使用for循环遍历,会将所有下标遍历,不遍历数组的对象属性,但是会遍历到空元素。遍历时下表都是数值。
  • (2)数组使用for in循环遍历,会将所有的可枚举属性遍历,如果该属性没有值就不遍历,例如数组中下标为空元素的,就不会被遍历,但是数组的对象属性会被遍历。

5.数组的方法

  • (1)push:可以在数组的尾部添加若干个元素,返回新数组的长度。 while(arr.push({})<10); //循环给尾部添加若干个空对象,且添加的对象没有引用值。
  • (2)pop:删除数组尾部的最后一个元素,并且将删除的元素返回。 while(arr.pop()!==3); //删除到某元素为止。
    将数组全部删除
    ①arr.length = 0;
    ②while(arr.length>0) arr.pop();
    ③如果数组中存储的是对象,我们必须把所有对象引用全部设为null。
        1°for(var i=0;i<arr.length;i++){
            arr[i]=null;
            }
            arr.length=0;
        2°for(var i=0;i<arr.length;i++){
            arr[i]=null;
    	    }
            arr.length=0;
    
  • (3)unshift:在数组的头部添加若干个元素,并且返回这个数组的新长度。
  • (4)shift:将数组的头部一个元素删除,并且返回这个元素。
  • (5)push,pop,unshift,shift 四个方法,操作以后原数组的引用关系不变。
  • (6)join:使用某个字符作为连接符,将数组的所有元素连接成为一个字符串,并且返回这个字符串。 如果没有连接符,默认以逗号连接。
  • (7)concat:连接数组。 数组连接若干个数组或者元素,返回一个新的连接完成的数组,与原数组没有引用关系。
  • (8)splice: ①数组中从第几位开始删除多少个元素,并且返回被删除元素组成的新数组。 1°若输入删除多少,默认删除到尾部。 2°如果第一个参数是负数, 3°如果第一个参数是0,将一个数组的所有元素转移到另一个数组。 4°如果没有填写第一个参数,没有删除,并且返回空数组。 5°arr.splice(-3,2):从倒数第3个元素向后删除2个元素。 ②数组中从第几位开始删除多少个元素,并且在该位置插入新的若干元素, 返回被删除元素组成的新数组。 arr.splice(1,arr.length,2,3):从某位开始,删除后边所有元素,并且添加2,3两个元素。 ③在数组的第几位插入若干元素,并且返回新的数组。 arr.splice(1,0,"a");
  • (9)slice:从第几项开始到底第几项结束,复制中间所有元素到新数组(结束元素不被复制),原数组不发生改变。 arr1=arr.slic(); //复制原数组到新数组,并且没有引用元素。
  • (10)reverse:当前数组按照倒装顺序将原数组颠倒,并且返回原数组。
  • (11)sort:根据ascll码进行排序。 ①arr.sort(function(a,b){ return a-b}); 根据数字从小到大排序。 ②arr.sort(function(a,b){ return b-a}); 根据数字从大到小排序。 ③arr.sort(function(a,b){ return a.prop-b.prop}); 对象型数组根据prop内值进行排序。
    排序算法
    ①冒泡排序   ②选择排序  ③快速排序
    
  • (12)indexOf:在数组中查找元素,并且返回该元素的下标,如果没有找到则返回-1。 arr.indexOf(a,b) a为要寻找的元素,b为从b下标开始搜索。 ①indexOf 实现去重: var arr=[5,4,4,3]; var arr1=[]; for(var i=0;i<arr.length;i++){ if(arr.1indexOf(arr[i<0])) arr1.push(arr[i])}
  • (13)lastIndexOf(要查找的元素,从什么位置开始查找) 从后向前查找元素。‘’
  • (14)fill:填充 ①fill(要填充的值,从什么位置开始,到什么位置结束); ②fill只能适用于有长度的数组,如果不给开始位置和结束位置就会全部覆盖填充。 ③fill如果填充的为对象,就会造成填充同一个引用地址的对象。
  • (15)some:遍历数组,判断元素是否满足条件,如果有元素满足,直接跳出,返回true,如果所有元素都不满足,返回false。
  • (16)every:遍历数组,并且判断每个元素是否满足条件,如果不满足直接跳出,返回false,都满足条件,返回true。

6.列表强转数组

  • (1)将列表强转成数组(es6):var arr =Array.from(divs);
  • (2)var arr=Array.prototype.slice.call(divs);
  • (3)var arr=[].slice.call(divs);
  • (4)var arr =Array.prototype.concat.apply([],divs);
  • (5)var arr=[].concat.apply([],div);

7.数组的遍历

  • (1)forEach: 遍历数组,可以获取数组内元素和下标,自动过滤空元素(即空元素不遍历)。 arr.forEach(function(item,index,arr){ console.log(item,index,arr)}) 相较于for in来说,forEach不会遍历到数组的属性。 相对于for来说,forEach不会遍历空元素。 forEach缺点:函数中this指向将会被改变。
  • (2)map:遍历数组,并且使用return 返回元素,被返回元素放入一个新的数组中,新数组长度和原数组相同。

8.数组随机乱序:

arr.sort(function(a,b){
//Math.random:随机生成0-1之间的浮点数,不包含1。
return Math.random()-0.5;})

9.索引查找对象:

function searchObj(arr,obj){
for(var i=0;i<arr.length;i++){
 if(JSON.stringify(arr[i])===JSON.stringify(obj)) return i;
}
return -1;
}

10.过滤、筛选:就是将满足条件的元素放在一个新数组中,并且返回这个新数组.

var arr1=arr.fileter(function(item){
    })

11.归并

reduce:
var sum =arr.reduce(function(value,item,index,arr){
    return value+=item})
  • (1)如果没有初始值,value就是数组下标为0的元素,而后面的item从1开始。
  • (2)第二次运行 遍历时,value将会是上次运行return的返回值。
  • (3)当数组的每个元素遍历完成后将最后一次的返回值返回到外面的变量。
  • (4)当使用reduce设置最后的初始值时,value将会在开始为这个初始值,并且遍历将会从数组的第0项开始,item就是下标为0的元素开始。

12.二维数组

var arr=[[1,2,3],[4,5,6]];
(1)flatMap:扁平化数组。将二维数组转换为一维数组。

13.数组取最大值和最小值

最大值:Math.max.apply(null,arr);
最小值:Math.min.apply(null,arr);