递归函数的使用

79 阅读1分钟

最近在做项目时用到了递归调用,是表格树勾选上级需要把下级的同时勾选上,由于使用的是低代码平台,平台那边暂不提供这种功能,所以只能自己写了。 代码如下:

//onSelect事件
viewModal.on(result.tableUi.key, 'onSelect', async params => {
    // todo   如果不是末级,则执行两次
    let selectedData = params.data

    if (Array.isArray(selectedData)) {
      return
    }
    
    //分以下4种情况,  
    1、有子级,且勾选
    2、有子级,不勾选
    3、无子级,勾选   勾选,只处理传递给后端的数据即可,后端只需要末级节点的数据,非末级不需要,result.checkList是传给后端的数据
    4、无子级,不勾选      不勾选,则从result.checkList中去除

    console.log('params: ', params.data)
    if (selectedData.children && selectedData._check === true) {
      result.setSelectRows(selectedData.children)

      result.checkedList = result.filterData(result.checkedList, 'id')
      viewModal.get(result.tableUi.key).setSelectRow(result.checkedList, true)
      result.checkList = result.checkedList.filter(item => item.isEnd === '1')

      result.checkList = result.filterData(result.checkList, 'id')
    } else if (selectedData.children && selectedData._check === false) {
      // 如果父级不勾选,则子级也不勾选
      result.setSelectRows(selectedData.children)
      viewModal.get(result.tableUi.key).setSelectRow(result.checkedList, false)
      result.checkedList = result.filterData(result.checkedList, 'id')
      result.checkList = result.checkedList.filter(item => item.isEnd === '1' && item._check === true)

      result.checkList = result.filterData(result.checkList, 'id')
    } else if (!selectedData.children && selectedData._check === true) {
      result.checkList.push(selectedData)
      result.checkList = result.filterData(result.checkList, 'id')
    } else if (!selectedData.children && selectedData._check === false) {
      result.checkList.splice(
        result.checkList.findIndex(item => item.id === selectedData.id),
        1
      )
    }
    console.log('result.checkedList: ', result.checkedList, result.checkList)
  })
  
  
  //给checkedList push值
  setSelectRows(data) {
      data.forEach(item => {
        result.checkedList.push(item)
        if (item.children) {
          this.setSelectRows(item.children)   //如果有children,就再调用此方法即可
        }
      })
},
    
// 数据去重
filterData(data, key) {
  let arr = data
  if (data && data.length) {
    arr = data.filter((x, index) => {
      let arrKey = []
      data.forEach(item => {
        arrKey.push(item[key])
      })
      return arrKey.indexOf(x[key]) === index
    })
  }
  return arr
},