数组

95 阅读5分钟

一、创建

 直接量方式:
 var arr=[]
 var arr=[数据1,数据2,...]
 构造函数方式:
 var arr=new Array()
 var arr=new Array(数据,...)

二、访问

 数组[i]

三、后续添加/替换元素

 数组[i]=数据
 是添加还是替换,具体看i位置有没有数据

四、数组具有三大不限制

 1.不限制元素个数
 2.不限制元素类型
 3.不限制下标越界
 获取元素时,如果下标越界,会得到undefined,追加元素时,如果下标越界,会得到一个稀疏数组

五、属性

数组名.length
三个固定套路:
1.向末尾添加元素:arr[arr.length]=数据
2.获取数组倒数第n个元素:arr.[arr.length-n]
3.删除数组倒数n个元素:arr.length-=n

六、遍历数组

方法一:
for(var i=0;i<arr.length;i++){
    arr[i]
}
方法二:
直接修改原数组
arr.forEach(function(val,i,arr){
     val:当前值  i当前值的下标  arr数组本身
     操作;
})
方法三:
不修改原数组,返回一个新数组
var newArr=arr.map(function(val,i,arr){
     val:当前值  i当前值的下标  arr数组本身
     return  操作;
})
方法四:
for(var i in 数组名){
    数组名[i]
}

七、数组的API

1.数组转为字符串

不改变原数组,返回一个新数组,需要拿个变量去接
语法:var str=arr.join("自定义连接符")
1.1 笔试题:将数组里里面的内容拼接为一句话:arr.join("")
   例: 
   var arr=["h","e","l","l","o","w","o","r","l","d"]
   var newArr=arr.join("")
   console.log(newArr)
1.2 将数组里面的数据拼接为DOM页面元素
   var str="<option>"+arr.join("</option><option>")+"</option>"
   例:
    var arr=["北京","南京","东京"]
    var str="<option>"+arr.join("</option><option>")+"</option>"
    var select=document.createElement("select")
    select.innerHTML=str
    var body=document.getElementsByTagName("body")[0]
    body.appendChild(select)

2.拼接数组

 不改变原数组,返回一个新数组,需要拿个变量去接
 语法:var newArr=arr.concat(新值1,...)
 根据传入的实参全部拼接到数组末尾 
 支持传入数组,但是会打散放入

3.截取子数组

 3.1 不改变原数组,返回一个新数组,需要拿个变量去接
 3.2 语法:var subArr=arr.slice(starti,endi+1)
 3.3 特殊:
     含头不含尾,
     endi可以省略不写,会从starti一直截取到末尾
     endi和starti都可以省不写,从头截到尾-深拷贝
     支持负数,-1代表截取倒数第一个

4.删、插、替

直接修改原数组
删除:
var dels=arr.splice(starti,n),n代表删除的个数
特殊:splice也有返回值,返回的是删除元素组成的数组
插入:
arr.splice(starti,0,新值1,...)
特殊:原starti位置的元素及后续元素都会向后顺移
替换:
var dels=arr.splice(starti,n,新值1,...)
特殊:插入的个数和删除的个数不必相等

5.反转数组

直接修改原数组
arr.reverse()

6.数组排序

6.1 冒泡排序
   思路:从第一个元素开始,依次比较相邻的两个元素,如果前一个大于后一个,两者就交换位置
   公式:
   for(var i=0;i<arr.lenth-1;i++){
      for(var j=0;j<arr.lenth-1;j++){
         if(arr[i]>arr[i+1]){
            var m=arr[i]
            arr[i]=arr[i+1]
            arr[i+1]=m
         }
       }
    }
6.2 sort
   直接修改原数组
   arr.sort(function(){
   return a-b
   })
   a代表后一个数,b代表前一个数,a-b代表升序,b-a代表降序
   如果数组是字符串,arr.sort()排序即可

7.栈和队列

栈:
shift/unshift
unshift:从数组前面添加元素,缺点:导致其余元素下标发生变化
arr.unshift(新值,...)
shift:从数组前面删除元素,一次只能删除一个,返回值为被删除的元素
arr.shift()
栈:
push/pop
push:从数组后面追加元素
arr.push(新值,...)
pop:从数组后面删除元素,,一次只能删除一个,返回值为被删除的元素
arr.pop()
队列:
开头进,结尾出:arr.unshift()  arr.pop()
队列:
结尾进,开头出:arr.push()  arr.shift()

8.判断

8.1 every
   每一个,理论等效于&&,全部满足结果才为true,只要一个不满足,结果就为false
   var bool=arr.every(function(var,i,arr){
         val:当前值  i当前值的下标  arr数组本身
         return 条件(必写的)
         如果没有写return,默认返回return undefined,那一来就为false
   })
   例:
   var arr=[1,2,3,4,5,6]
   var bool=arr.every(function(val,i,arr){
        return val>3
   })
   console.log(bool)=false
8.2 some
   每一个,理论等效于||,全部不满足结果才为false,一个满足,结果就为true
   var bool=arr.some(function(var,i,arr){
       val:当前值  i当前值的下标  arr数组本身
        return 条件(必写的)
   })
   例:
   var arr=[1,2,3,4,5,6]
   var bool=arr.some(function(val,i,arr){
        return val>5
   })
   console.log(bool)=ture

9.过滤和汇总

过滤:根据你的条件筛选出你需要的部分,不会修改原数组
var subArr=arr.filter(function(val,i,arr){
    return 条件
})
例:
var arr=[1,2,2,3,5,6]
var subArr=arr.filter(function(val,i,arr){
      return val>3
})
console.log(subArr)=[5,6]
汇总:把元素汇总到一起
var sum=arr.reduce(function(prev,val,i,arr){
    return prev+val
    prev:相当于我们平时用的sum,初始值为0
},基础值)
例:
var arr=[1,2,2,3,5,6]
var sum=arr.reduce(function(prev,val,i,arr){
        return prev+val
},10)
console.log(sum)=29 

八、hash数组

1.概念:下标可以自定义的数组
2.创建:
先创建一个空数组,var arr=[]
为空数组添加自定义下标和内容:arr["自定义下标"]=新值
3.访问:arr["自定义下标"]
4.强调:hash数组的长度永远为0
5.遍历:因为长度为0,只有用for in 循环
    for(var i in 数组名){
        数组名[i]
    }
6.hash数组的原理:
  hash算法:将字符串计算成一个尽量不重复的数字(地址值),如果字符串内容相同,则计算出来的数字也相同
  添加元素:将自定义算法交给hash算法,就会得到一个数字(地址值),将你要保存的  数据放到了此地址
  获取元素:将指定的自定义下标交给hash算法,得到一个和当初添加元素时一样的数字,然后找到保存的数据
  js里万物皆对象(除了null和undefined),一切对象的底层都是hash数组 

九、二维数组

1.概念:数组内引用着另外的数组
2.创建:
var arr=[   ["lucy",18,3500]
   ["ali",19,4500]
   ["jac",20,5000]
 ]
3.访问:arr[行下标][列下标]
4.特殊:行下标越界会得到undefined,列下标越界会报错,因为只有数组才可以使用[下标], 
       行下标越界已经得到undefined,就没有资格再使用[下标]
5.遍历:必然需要两层循环,外层控制行,内层控制列
for(var i=0;i<arr.length;i++){
   for(var j=0;j<arr.length;j++){
      arr[i][j]
  }
}