一、回顾
1、转换为字符串,不改变原数组,返回新数组。
(1)toString(),将数组元素转换成字符串后,用’ , ‘拼接起来。
(2)Array.prototype.join(),用传入的参数将元素拼接成字符串并返回。默认用’ , ‘拼接。
(3)将字符串转化为数组。String.prototype.split()。根据传入的分隔符,将字符串分割,并以数组形式返回。
2、在头部、尾部添加新元素。改变原数组,返回新数组的长度。
(1)push,将参数作为元素添加到数组尾项。
(2)unshift,将参数从数组头部添加进数组。
3、在头部、尾部删除元素。改变原数组,返回删除的元素。
(1)pop,删除数组尾项。
(2)shift,删除数组首项。
4、截取数组部分,不改变元素组,返回截取部分。
(1)slice,
start截取开始位置 可正可负
end截取结束位置(不包含该元素),省略的话,则截取到元素尾项。Array.prototype.slice.call( arguments )类数组截取所有元素,并以数组形式返回。
5、增删改查数组,返回删除的部分
split,
start 删除开始位置
deleteCount 删除元素个数, 如果省略,start后的所有元素会被删除。
item1, …… , itemN 新增的元素
6、排序, 改变元素组
(1)reverse 反序
(2)sort()接受排序函数
默认将元素转换为字符串后进行排序(比较unicode码)
正序、倒叙、乱序都行
7、查找元素是否存在于数组中
(1)indexOf,返回元素第一次出现在数组中的索引,不存在则返回-1
(2)lastIndexOf,返回元素最后一次出现在数组中的所以,不存在则返回-1
(3)find(),接受一个判断函数,返回满足判断函数的第一个元素
(4)findIndexOf(),接受一个判断函数,返回满足函数的第一个元素的索引,不存在则返回-1
未回忆起来
(5)includes,判断是否包含相应元素,返回boolean值。
8、Array.prototype.fill 填充数组,改变原素组,返回改变后的数组。
val 填充的值
start,填充开始位置
end,填充结束位置,不包含该位置
9、类数组转换为数组的三种方法。
(1)Array.prototype.slice.call()
(2)拓展运算符 [ …arguments ]
(3)Array.from,构造函数静态方法(没有写在原型对象上,函数自身的方法)
10、合并数组
(1)concat, 合并数组
参数可以是数组,也可以是其他类型值,可以是多个参数。
返回合并后的新数组。不能直接用Array.prototype.push.call来模拟。
未回忆起来
(2)拓展运算符
[…arr1, …arr2]
11、创建数组
(1)Array() 创建数组,参数为单个number,创建length为number的空数组
(2)Array.of() 以参数为元素创建数组
(3)Array.from()将类数组转化为数组
二、数组遍历方法
(1)for … in是为遍历对象属性而构建的,数组可以用Array.prototype.forEach()和for … of
(2)forEach,每个元素执行一次函数,没有返回值(即使函数中写了return)
callback,元素执行的函数
val,当前元素
index,当前元素的索引
arr,当前循环的元素
thisarg,用作函数中this的值
let obj = {
a:'a',
name:'obj',
arr: [1,2,3],
fn: function(){
this.arr.forEach(function(item,index,arr){
console.log(item,index,arr, this)
}, this )
//不想指定callback中this的话,可以将callback写成箭头函数(定义时,已经绑定this)
}
}
obj.fn()
forEach与this的对比
(1)forEach不会遍历空数组和稀疏数组空值部分,for循环会遍历到空值部分。
let arr = [1,,3];
arr.forEach((item,index,arr)=>{
console.log(item,index,arr,this)
},this)
for(var i = 0 ;i < arr.length; i++){
console.log(arr[i])
}
(2)forEach中不能使用 break和continue,for循环中可以
for循环的遍历能更好的控制。
对类数组调用forEach,可以直接将类数组转化为数组,也可以call,Array.prototype.forEach.call( arguments )
[ …arguments ].forEach( ( item )=>{ console.log(item) } )更方便
function(...arg){
[ ...arg ].forEach()
}
3、forEach
遍历数组,对每个元素执行传入的参数,返回新数组。如果没有返回值,默认返回undefined。如果不打算使用返回的数组,请使用forEach或者for…of
4、filter
遍历数组,返回通过测试函数的元素。
过滤数据
let arr = [1,5,-1,0,undefined,null];
function isNumber(num){
return num != null
//undefined == null and undefined == undefined andd null == null 都为true
//udefined 和 null与其他值都不相等
}
console.log(arr.filter((item)=>{
return isNumber(item)
})
5、some - every
some,遍历元素,只要有一个元素通过测试函数,返回true
every,遍历元素,只要有一个元素不通过测试函数,返回false。
6、遍历元素,对每个元素执行reducer函数,将结果汇总为单个值进行返回(返回任意类型的结果)。
参数
(1)reducer函数
reducer接受四个参数
(1)accumulator,累计器
(2)当前元素
(3)当前元素索引
(4)正在遍历的数组
(2)initialValue,累计器初始值。可选
如果有initialValue,则将作为accumulator原始值,从数组首个元素开始执行reducer函数。
如果没有initialValue,则将数组第一位元素作为accumulator原始值,从后一位元素开始遍历执行reducer函数。
使用场景,
(1)累加
比起forEach,可以省掉一个用来保存数据的临时变量。
(2)二维数组转换为一维数组
let arr = [1,2,3,[4,5,6,]]
console.log(arr.reduce((accumulator,ele)=>{
if(Object.prototype.toString.call(ele) === '[object Array]'){
return [...accumulator, ...ele]
}else{
return [...accumulator,ele]
}
},[]))
(3)记录数组中元素出现的次数,可以将initialValue设为一个空对象,每次执行reducer的时候,条件性的修改记录对象并返回作为累计器。