数组:数据驱动显示
定义:是一个无序元素的紧密结构的有序列表
1.有序列表:排序
2.紧密结构:列表是具备长度的,而且这个长度会自动根据列表内容变化而变化,添加删除消耗性能大,速度慢;
另外,可以遍历有对应的下标,可以根据下标遍历到数组的所有元素。
3.无序元素:意味着元素可以不区分先后顺序,而且不能避免重复
新建数组
1.字面量创建
数组长度不固定(在js中数组长度是可以改变的)
var arr = []
2.实例化创建(构造函数实例化)
var arr = new Array()
3.构造函数创建
var arr = Array()
4.通过对象创建数组
var arr = new Object([])
注意:如果使用实例化创建和构造函数创建数组,参数只有一个,并且是数值的话,那么这个数数值必须是正整数,如果有小数和负整数都会报错,这个正整数就是这个数组的预设长度,里面都放入空元素。则无法通过这种方式创建一个数值元素的数组。
arr. length:数组中元素的个数
下标:每个元素在数组中的位置,从0开始
下标变量:数组对应的下标的存储单元
元素:组成数组的最基本单元,叫做元素或者元,也叫做下标变量的值
可枚举判断:
key和value必须存在:for...in...
可以把数组作为对象枚举遍历时,数组中的下标就变为了对象的key属性,对象key属性就是字符串
注意:数组的长度length是不可枚举属性
for...in...最好不要作为数组遍历方式使用,会遍历到数组的所有属性,包括对象属性
迭代器遍历
for...of...(往返在一个上面改变)
数组复制
var arr = ['a','b',,'c',undefined,'e'] var arr1=[] for(var i = 0;i < arr.length; i++){ if(!(i in arr)) continue //枚举遍历,看第i项是否有key和value值,是一种判断空元素的方式 arr1[i] = arr[i] }
给数组尾部添加元素:arr[arr.length] = 值
替换数组的最头部元素:arr[0] = 值
arr.length:是一个可读可写不可删除不可枚举的属性
可写:如果长度比原来多,就在后面添加空属性,否则,将多出来的数据删除
arr,length = 0 清空数组 arr = []清空数组是错误的,会造成内存泄漏
arr.length -- :删除最后一个元素
注意:如果使用arr.length进行数组的添加和删除,则需要先将arr.length 赋值给一个新的变量,因为添加和删除时,长度在改变
数组的方法:
-
push(数据1 ,数据2,数据3 ...)
function arrPush(arr){ if(!arr || arr.constructor !== Array) throw new Error(arr +' is a not Array') for(var i = 1; i<arguments.length;i++){ arr[arr.length]=arguments[i] } return arr.length }
-
pop()
function arrPop(arr){ if(!arr || arr.constructor !== Array) throw new Error(arr + ' is a not Array') if(arr.length===0) return var item = arr[arr.length-1] arr.length-- return item }
-
unshift(数据1 ,数据2,数据3 ...)
function arrUnshift(arr){ if(!arr || arr.constructor !== Array) throw new Error(arr + ' is a not Array') var len = arguments.length-1 if(!len) return arr.length for(var i = len+arr.length-1;i>=0;i--){ if(i>=len) arr[i]=arr[i-len] else arr[i]=arguments[i+1] } return arr.length }
-
shift()
function arrShift(arr) { if (!arr || arr.constructor !== Array) throw new Error(arr + ' is a not Array') if (arr.length === 0) return var item = arr[0] for (var i = 0; i < arr.length - 1; i++) { arr[i]=arr[i+1] } arr.length-- return item }
-
fill(要填充的数据,开始索引,结束索引)
function arrFill(arr,value,start,end){ if(!arr || arr.constructor !== Array) throw new Error(arr+' is a not Array') if(isNaN(start)) start = 0 if(isNaN(end)) end = arr.length start = Number(start) end = Number(end) if(start<0) start = start+arr.length<0 ? 0: start+arr.length if(end<0) end = end + arr.length < 0 ? 0:end+arr.length if(end>arr.length) end=arr.length for(var i = start;i<end;i++){ arr[i]=value } return arr }
-
concat(数据1/数据1,数据2/数组2...)
function arrayConcat(arr){ if (!arr || arr.constructor !== Array) throw new Error(arr + "is not Array!"); var array=[]; for(var i=0;i<arguments.length;i++){ if(arguments[i] && arguments[i].constructor===Array){ for(var j=0;j<arguments[i].length;j++){ array[array.length]=arguments[i][j]; } }else{ array[array.length]=arguments[i]; } } return array; }
-
slice(开始索引,结束索引)
function arraySlice(arr, start, end) { if (!arr || arr.constructor !== Array) throw new Error(arr + 'not a Array') start = ~~start end=~~end if (start < 0) start = start + arr.length < 0 ? 0 : start + arr.length if (end < 0) end = end + arr.length < 0 ? 0 : end + arr.length if(end > arr.length) end = arr.length var arr1 = [] for(var i = start; i < end ;i++){ arr1[arr1.length] = arr[i] } return arr1 }
-
indexOf(要查找的数据,开始的位置)
function arrayIndexOf(arr,item,start){ if (!arr || arr.constructor !== Array) throw new Error(arr + 'not a Array') start = ~~start if(start < 0) start = start + arr.length < 0 ? 0 : start + arr.length for(var i = start; i < arr.length; i++){ if(!(i in arr)) continue if(arr[i] === item) return i } return -1 }
-
lastIndexOf(要查找的数据,开始的位置)
function arrayLastIndexOf(arr,value,end){ if (!arr || arr.constructor !== Array) throw new Error(arr + 'not a Array') if(end === undefined) end=arr.length-1 end = ~~end if(end < 0) end = end+arr.length < 0? 0:end+arr.length for(var i =end;i>=0;i--){ if(!(i in arr)) continue if(arr[i] ===value) return i } return -1 }
-
splice(开始索引,多少个,数据1,数据2...)
function arraySplice(arr, start, deleteCount) { if (!arr || arr.constructor !== Array) throw new Error(arr + "not is Array"); if (start === undefined) return []; start = ~~start; if (start < 0) start = (start + arr.length) < 0 ? 0 : start + arr.length; if (deleteCount === undefined) deleteCount = arr.length - start; deleteCount = ~~deleteCount; if (deleteCount < 0) deleteCount = 0; if (deleteCount + start > arr.length) deleteCount = arr.length - start; var arr1 = []; for (var i = start; i < arr.length; i++) { if (i < start + deleteCount) arr1[arr1.length] = arr[i]; arr[i] = arr[i + deleteCount]; } arr.length -= deleteCount; var len = arguments.length - 3; if (len <= 0) return arr1; for (var j = arr.length - 1 + len; j >= start; j--) { if (j >= start + len) arr[j] = arr[j - len]; else arr[j] = arguments[3 + j - start]; } return arr1; }
-
reverse()
function arrayReverse(arr) { if (!arr || arr.constructor !== Array) throw new Error(arr + "not is Array"); var len = ~~(arr.length/2); for (var i = 0; i < len; i++) { if (!(i in arr)) continue; var temp=arr[i] arr[i]=arr[arr.length-1] arr[arr.length-1]=temp } return arr; }
-
join()
function arrayJoin(arr,sep){ if (!arr || arr.constructor !== Array) throw new Error(arr + 'not a Array') if(sep === undefined) sep =',' sep = String(sep) var str = '' for(var i = 0 ; i < arr.length ; i++){ if(i === arr.length -1) return str += arr[i] str += arr[i]+sep } }
-
includes(要查找的数据)
function arrayIncludes(arr,value){ if (!arr || arr.constructor !== Array) throw new Error(arr + "not is Array"); for(var i = 0; i < arr.length; i++){ if(!(i in arr)) continue if(value===arr[i]) return true } return false }
-
reduce(function(value,item,index,arr),value的初始值)
function arrayReduce(arr,fn,initValue){ if (!arr || arr.constructor !== Array) throw new Error(arr + "not is Array"); var i=0; if(initValue===undefined){ initValue=arr[0]; i=1; } for(;i<arr.length;i++){ initValue=fn(initValue,arr[i],i,arr); } return initValue; } function arrayReduceRight(arr,fn,initValue){ if (!arr || arr.constructor !== Array) throw new Error(arr + "not is Array"); var i=arr.length-1; if(initValue===undefined){ initValue=arr[arr.length-1]; i--; } for(;i>=0;i--){ initValue=fn(initValue,arr[i],i,arr); } return initValue; }
-
forEach(function(item,index,arr){})
function arrayForEach(arr, fn) { if (!arr || arr.constructor !== Array) throw new Error(arr + "not is Array"); for (var i = 0; i < arr.length; i++) { if (!(i in arr)) continue; fn(arr[i], i, arr) } }
-
map(function(item,index,arr){})
function arrayMap(arr, fn) { if (!arr || arr.constructor !== Array) throw new Error(arr + "not is Array"); var arr1 = []; for (var i = 0; i < arr.length; i++) { if (!(i in arr)) continue; arr1[i]=fn(arr[i], i, arr) } return arr1; }
-
filter(function(item,index,arr){})
function arrayFilter(arr, fn) { if (!arr || arr.constructor !== Array) throw new Error(arr + "not is Array"); var arr1 = []; for (var i = 0; i < arr.length; i++) { if (!(i in arr)) continue; if (fn(arr[i], i, arr)) arr1.push(arr[i]); } return arr1; }
-
every(function(item,index,arr){})
function arrayEvery(arr, fn) { if (!arr || arr.constructor !== Array) throw new Error(arr + "not is Array"); for (var i = 0; i < arr.length; i++) { if (!(i in arr)) continue; if (!fn(arr[i], i, arr)) return false; } return true; }
-
some(function(item,index,arr){})
function arraySome(arr, fn) { if (!arr || arr.constructor !== Array) throw new Error(arr + "not is Array"); for (var i = 0; i < arr.length; i++) { if (!(i in arr)) continue; if (fn(arr[i], i, arr)) return true; } return false; }
-
find(function(item,index,arr){})
function arrayFind(array,fn){ if (!arr || arr.constructor !== Array) throw new Error(arr + "not is Array"); for(var i=0;i<arr.length;i++){ if(!(i in arr)) continue; if(fn(arr[i],i,arr)) return arr[i]; } }
-
findIndex(function(item,index,arr){})
function arrayFindIndex(array, fn) { if (!arr || arr.constructor !== Array) throw new Error(arr + "not is Array"); for (var i = 0; i < arr.length; i++) { if (!(i in arr)) continue; if (fn(arr[i], i, arr)) return i; } return -1; }
-
flatMap(function(item,index,arr){})
function arrayFlatMap(array,fn){ if (!arr || arr.constructor !== Array) throw new Error(arr + "not is Array"); var arr1=[]; for(var i=0;i<arr.length;i++){ if(!(i in arr)) continue; // arr1=arr1.concat(fn(arr[i],i,arr)) var item=fn(arr[i],i,arr); if(item && item.constructor===Array){ for(var j=0;j<item.length;j++){ arr1.push(item[j]); } }else{ arr1.push(item); } } return arr1; }
-
flat(要拍平几层)
function flatMap(arr,target){ if(target===undefined) target=[]; for(var i=0;i<arr.length;i++){ if(arr[i] && arr[i].constructor===Array){ flatMap(arr[i],target); }else{ target.push(arr[i]); } } return target; }
-
sort()/sort(function(item,index,arr){})
function arraySort(arr,fn){ if (!arr || arr.constructor !== Array) throw new Error(arr + "not is Array"); for(var i=0;i<arr.length-1;i++){ for(var j=0;j<arr.length-1-i;j++){ if(arr[j]>arr[j+1]){ var temp=arr[j] arr[j]=arr[j+1] arr[i]=temp } } if(arr[j]===arr[j+1]) i++ } return arr }
-
copyWithIn(目标位置,开始索引,结束索引)
数组方法归纳
1.改变原数组:
push(),pop(),unshift(),shift(),splice(),reverse(),sort(),fill(),copyWithin(),
2.不改变原始数组
concat(),slice(),map(),filter(),flat(),flatMap(),
数组元素计数:
var obj={} for(var i=0;i<arr.length;i++){ if(!(i in arr)) continue if(!obj[arr[i]]) obj[arr[i]]=0 obj[arr[i]]++ }
数组去重
1.改变原始数组
for(var i=0;i<arr.length;i++){ for(var j=0;j<arr.length;){ if(arr[i]===arr[j]) arr.splice(j,1) j++ } }
2.不改变原始数组
var arr1=[] YYH:for(var i=0;i<arr.length;i++){ for(var j=0;j<arr.length;j++){ if(arr[i]===arr[j]) continue YYH } arr1.push(arr[i]) }
var arr2=[] for(var i=0;i<arr.length;i++){ if(!(~arr2.indexOf(arr1[i]))) arr2.push(arr[i]) //if(arr2.indexOf(arr1[i])===-1) arr2.push(arr[i]) //if(!arr2.includes(arr1[i])) arr2.push(arr[i]) }
3.将两组数据相同的数据取出来
var arr3=[] for(var i=0;i<arr.length;i++){ if(arr1.includes(arr[i])&&!arr3.include(arr[i])) arr3.push(arr[i]) }
4.将两组数据不同的取出来
//先将数组去重 function difer(arr){ for(var i=0;i<arr.length;i++){ for(var j=0;j<arr.length;){ if(arr[i]===arr[j]) arr.splice(j,1) j++ } } return arr } //将数组的用对象的方式保存 function getCountObj(arr){ var obj={} for(var i=0;i<arr.length;i++){ if(!(i in arr)) continue if(!obj[arr[i]]) obj[arr[i]]=0 obj[arr[i]]++ } return obj } var newArr=[] //将两个数组去重后连接起来 arr = difer(arr).concat(difer(arr1)) //将连接起来的数据转换为对象 var obj=getCountObj(arr) for(var i=0;i<arr.length;i++){ if(!(i in arr)) continue if(obj[arr[i]]>1) continue newArr.push(arr[i]) }
try...catch..finally
try不管执行了多少,只要遇到错误,就会执行catch语句,try还是有效,只是不会报错了,而不管报错与否,都会执行finally语句
可以通过try..catch语句来中断forEach()循环
注意:throw必须用在函数里面
数组的静态方法
1.Arrayfrom()
参数1:迭代器
参数2:函数(跟map的功能一致)
2.Array.isArray():判断某个元素是不是数组
sort()排序
1.冒泡排序
for(var i=0;i<arr.length-1;i++){ for(var j=0;j<arr.length-1-i;j++){ if(arr[j]>arr[j+1]){ var temp=arr[j] arr[j]=arr[j+1] arr[i]=temp } } if(arr[j]===arr[j+1]) i++ }
2.选择排序
for(var i=0;i<arr.length;i++){ var min=i; for(var j=i+1;j<arr.length;j++){ if(arr[j]<arr[min]) min=j } if(min!==i){ var temp=arr[min] arr[min]=arr[i] arr[i]=temp } if(arr[i]===arr[i+1]) i++ }
3.快速排序
function quickSort(arr){ if(arr.length<=1) return arr; var centerIndex=~~(arr.length/2) var left=[] var right=[] for(var i=0;i<arr.length;i++){ if(i===centerIndex) continue if(arr[i]<arr[centerIndex]) left.push(arr[i]) else right.push(arr[i]) } return quickSort(left).concat(arr[centerIndex],quickSort(right)) }
二维数组
二维数组本质上是以数组作为数组元素的数组,即“数组的数组”,类型说明符 数组名 [常量表达式] [常量表达式]。二维数组又称为矩阵,行列数相等的矩阵称为方阵。对称矩阵 a[i] [j] = a[j] [i] [对角矩阵]:n阶方阵[主对角线]外都是零元素
对象数组