js学了这么久,for循环早已烂熟于心,随着ES6的盛行,各种数组方法纷纷揭竿而起,大行其道。我以为自己已经用熟了forEach,map,filter,every,some,reduce,reduceRight,find,等等方法,但其实并没有。下边是我做小程序时一个修改密码功能:
validataSubInfo(){
let arr = [
{
item:!this.data.username,
errorMessage:'请输入登录密码'
},
{
item: !this.data.password,
errorMessage: '请输入新密码'
},
{
item: !this.data.password2,
errorMessage: '请再次输入新密码'
},
{
item: this.data.password != this.data.password2,
errorMessage: '两次新密码输入不一致',
errorCallback:()=>{
this.setData({
password:'',
password2:''
})
}
},
]
return arr
},
submit(e) {
let arr = this.validataSubInfo()
let returnState = true
arr.map(item=>{
if(item.item){
wx.showToast({
title: item.errorMessage,
icon: 'none',
duration: 2000
})
if (item.errorCallback) {
item.errorCallback()
}
returnState = false
break
}
}
if(returnState){
...
}
潇洒的按下回车,嘴角噙着笑意,想象着自己距离大牛又近了一步,可是。。。它竟然报错了,问了问我的美度娘,原来forEach,map不能在循环执行完毕之前退出。既然如此,那就改呗。第一反应用for..of..,可是写完了之后我自己觉得有违自己之前立下的flag:尽可能不用low逼的for循环!本着自己吹的牛逼跪着也要吹完的目标,嗯,我改!怎么改呢?灵机一动,try..catch..啊!于是,我的代码成了这样:
submit(e) {
let arr = this.validataSubInfo()
let returnState = true
try{
arr.map(item=>{
if(item.item){
wx.showToast({
title: item.errorMessage,
icon: 'none',
duration: 2000
})
if (item.errorCallback) {
item.errorCallback()
}
returnState = false
throw New Error('你得给我跳出去')
}
}
}catch(e){
console.log(e)
}
if(returnState){
...
}
得嘞,吃饭去。。等会儿~,用try..catch..还得多写几行代码,不写行不行?放下饭碗,在想想:刚刚说到啥?some和every是吧?some和every应该是可以中途下车的,毕竟只要有不符合条件的这两个小机灵鬼就下车。every()当内部return false时跳出整个循环,而some()当内部return true时跳出整个循环,琢磨片刻,得嘞,就这么办:
submit(e) {
let arr = this.validataSubInfo()
let returnState = true
// try{
// arr.map(item => {
// if (item.item) {
// wx.showToast({
// title: item.errorMessage,
// icon: 'none',
// duration: 2000
// })
// if (item.errorCallback) {
// item.errorCallback()
// }
// returnState = false
// throw new Error('你得给我跳出去')
// }
// })
// }catch(e){
// console.log(e)
// }
arr.some(item => {
if (item.item) {
wx.showToast({
title: item.errorMessage,
icon: 'none',
duration: 2000
})
if (item.errorCallback) {
item.errorCallback()
}
returnState = false
return true
}
})
if(returnState){
...
}
}
得嘞,可以上菜了:蒸羊羔儿、蒸熊掌、蒸鹿尾儿、烧花鸭、烧雏鸡、烧子鹅、炉猪、炉鸭、酱鸡、腊肉、松花、小肚儿。。。再加一碗米饭,饱了~