es6新增处理数组的方法,map、forEach、filter、some、every、reduce等
map对数组遍历并返回新数组
使用方法
const arr = [1,2,3];
let resArrFor = arr.forEach(item=>{
console.log(item*2)
return item*2
})
console.log(resArrFor); // undefined
forEach对数组遍历,不返回值
使用方法
let resArr = arr.map(item=>{
console.log(item*2)
return item*2
})
console.log(resArr); //[2,4,6]
注意事项:
forEach只会将异步代码执行,不会等待回调函数的结果,所以在内部使用await或promise无效。不会等待内部异步执行完成后才执行后续同步代码,要解决此问题,只能使用for替代。
const list = [1,2,3,4,5]
let run = (num)=>{
return new Promise((resolve, reject)=>{
setTimeout(()=>{
resolve(num)
},1000)
})
}
let testForEach = ()=>{
list.forEach(async l=>{
const r = await run(l)
console.log('forEach执行结果: ',r);
})
console.log('forEach外部log');
}
console.log('------------------------');
let testFor = async()=>{
for(let i=0;i<list.length;i++){
const r = await run(list[i])
console.log('for执行结果: '+r);
}
console.log('for外部log');
}
testForEach()
testFor()
以上代码执行结果
forEach外部log
forEach执行结果: 1
forEach执行结果: 2
forEach执行结果: 3
forEach执行结果: 4
forEach执行结果: 5
————————————
for执行结果: 1
for执行结果: 2
for执行结果: 3
for执行结果: 4
for执行结果: 5
for外部log
forEach会先打印后边的log,然后同时打印出来1-5的执行结果。forEach在执行异步的时候类似并发执行。使用for执行会等待异步的结果。
filter的用法
使用filter对数组去重
const array = [5,4,7,8,9,2,7,5];
// 主要是,如果值存在,则索引值只会使用第一个的,后边的值会被过滤掉
array.filter((item,idx,arr) => arr.indexOf(item) === idx);
reduce的使用
reduce可以处理数组的去重、扁平化、求和等,reduce(function(prev, now, index, arr){ }, value?)
参数(prev, now, index, arr),value为迭代开始的值
- prev: 表示函数执行时的上一个元素,如果value不存在,第一次表示数组的第一个值,否则就是value的值
- now:表示函数执行时的当前元素,如果value 不存在,第一次表示数组第二个值,否则是数组第一个值
- index: 从0开始,索引值
- arr:表示数组
使用reduce求和
let arr1 = [1,2,3,4,5,6,7,8,9]
console.log("数组求和",arr1.reduce((prev, now)=>{
return prev + now;
}))
使用reduce将数组扁平化
let arr2 = [1,2,[3,"k",[8,"o"],["p"]],"p",[9,0]]
let flatArray = (arr)=>{
return arr.reduce((prev, now)=>{
return prev.concat(Array.isArray(now) ? flatArray(now) : now)
},[])
}
console.log("数组扁平化", flatArray(arr2))
使用reduce求数组元素的个数
let fruit = ["苹果","香蕉", "橘子", "香蕉", "西瓜", "樱桃", "苹果"]
let fruitNum = fruit.reduce((prev, now)=>{
if(now in prev){
prev[now]++;
}else{
prev[now] =1;
}
return prev;
},{})
console.log("水果的个数", fruitNum)
使用reduce将数组去重
let arr3 = [1,2,3,1,2,3,2,4,5,6,6,1,2,7,8,9]
console.log("去重后的数组",arr3.reduce((prev, now)=>{
if(prev.includes(now)){
return prev
}else{
return prev.concat(now)
}
},[]))