记一次Array.map循环使用的细节

251 阅读2分钟

js学了这么久,for循环早已烂熟于心,随着ES6的盛行,各种数组方法纷纷揭竿而起,大行其道。我以为自己已经用熟了forEach,map,filter,every,some,reduce,reduceRight,find,等等方法,但其实并没有。下边是我做小程序时一个修改密码功能:

这只是一个常见的表单提交,因为不想再提交方法里写那么多if..else判断,所以我决定把验证、错误信息、执行的回调都塞到一个数组中,在提交的时候循环验证。代码如下:

  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){
        ...
    }
  }

得嘞,可以上菜了:蒸羊羔儿、蒸熊掌、蒸鹿尾儿、烧花鸭、烧雏鸡、烧子鹅、炉猪、炉鸭、酱鸡、腊肉、松花、小肚儿。。。再加一碗米饭,饱了~