JS 将一维数组转为树结构(tree)/改变树级结构为普通数组对象类型/ 树结构查询/树结构种通过id获取完整数据对象/给树结构加序号(Util)

/**
 * @Description: 全局公用方法

 * @date 2019/10/11
 */



(function (window) {
  let Util = {}
  Util.baseUrl = 'http://autobuild.jiguantong.com'
  Util.baseUrlPHP = 'http://autobuild.1357.cn'
  // Util.baseUrlPHP = 'http://spm.cscecgx.com'
  // Util.baseUrl = 'http://autobuild.jiguantong.com'
  // 测试环境
  // Util.domain = Util.domainTenant = Util.domainRole =
  //   Util.domainSMS = Util.domainUser = Util.domainDict =
  //     Util.domainBasicBusiness = 'http://39.107.87.101:'
  // 本地开发环境
  Util.domain = Util.domainTenant = Util.domainRole = Util.domainSMS = Util.domainUser = 'http://39.106.209.183:'
  Util.domainDict = 'http://47.94.226.215:'
  Util.domainBasicBusiness = 'http://192.168.0.101:'


  Util.port = '10030'
  Util.portAdLogin = '20030'
  Util.portForOrg = '20020'
  Util.portForDept = '20020'
  Util.portTenant = '20010'
  Util.portUser = '20020'
  Util.portRole = '20020'
  Util.portSMS = '20040'
  Util.portDict = '20080'
  Util.portApp = '20020'
  Util.portBasicBusiness = '20080'
  Util.processError = function (vm, response) {
    if (response.statusCode == 200) {
      // vm.$message.success(response.statusMessage);
    } else {
      vm.$message.error(response.statusMessage);
    }
    return false
  }
  /**
 
   * 处理所有的vue-axios的response 并判断是否成功
   * 2个回调函数, 处理成功和失败
   * @param response
   * @param sucessCallback 成功回调
   * @param failCallback  失败回调
   */
  Util.processRes = function (response, sucessCallback, failCallback) {
    if (response.statusCode == 200) {
      sucessCallback && sucessCallback(response)
    } else {
      failCallback && failCallback(response)
    }
  }

  Util.propsArrayToString = function (array) {
    let resultArray = []
    for (let i = 0; i < array.length; i++) {
      let current = array[i]
      resultArray.push(current.id + ':' + current.value)
    }
    return resultArray.join(',')
  }
  /**
   * 
   */
  Util.deepCopyDelChildrenNull = function (arr) {
    let result = []
    arr.length && arr.forEach((item) => {
      let obj = {}
      if (item.children && item.children.length) {
        obj = item
        obj.children = Util.deepCopyDelChildrenNull(item.children)
      } else {
        for (let key in item) {
          if (key != 'children') {
            obj[key] = item[key]
          }
        }
      }
      result.push(obj)
    })
    return result
  };

   /*给树结构加序号*/
   Util.initHandNode = function (data, index, seq) {
      seq = seq || "1";
      let length = data.length;
      for (let i = length; i--; ) {
        data[i]["nodeLevel"] = index;
        data[i]["nodeIndex"] = i + 1;
        if (seq == "1") {
          data[i]["nodeSeq"] = data[i]["nodeIndex"] + "." + seq;
        } else {
          data[i]["nodeSeq"] = seq + "." + data[i]["nodeIndex"];
        }
        if (data[i].children) {
          data[i].children = this.initHandNode(
            data[i].children,
            index + 1,
            data[i]["nodeSeq"]
          );
        }
      }
      return data;
    };

  /**
   *将一维数组转为树结构
   */
  Util.translateDataToTree = function (arr = [], _p_keyword = 'pid', _c_keyword = 'children', _root_id = '0') {
    let _new_arr = []
    arr.length && arr.forEach(item => {
      let _obj = item
      _obj.key = item.id
      _obj.title = item.name
      _new_arr.push(_obj)
    })
    //没有父节点的数据
    let parents = _new_arr.filter(value => value[_p_keyword] === _root_id || value[_p_keyword] == null)
    if (!parents.length) return _new_arr
    //有父节点的数据
    let children = _new_arr.filter(value => value[_p_keyword] !== _root_id && value[_p_keyword] != null)
    //定义转换方法的具体实现
    let translator = (parents, children) => {
      //遍历父节点数据
      parents.forEach((parent) => {
        //遍历子节点数据
        children.forEach((current, index) => {
          if (current[_p_keyword] === parent.id) {
            //对子节点数据进行深复制
            let temp = Util.deepCopy(children)
            //让当前子节点从temp中移除,temp作为新的子节点数据,这里是为了让递归时,子节点的遍历次数更少,如果父子关系的层级越多,越有利
            temp.splice(index, 1)
            //让当前子节点作为唯一的父节点,去递归查找其对应的子节点
            translator([current], temp)
            //把找到子节点放入父节点的children属性中
            typeof parent.children !== 'undefined' ? parent.children.push(current) : parent.children = [current]
          }
        }
        )
      }
      )
    }
    translator(parents, children)
    return parents
  };
  /**
   * 处理树结构数据
   */
  Util.dealData = function (tree, clickType) {
    let arr = []
    tree.length && tree.forEach((item) => {
      let obj = {}
      obj = Util.deepCopy(item)
      obj.pId = item.pid
      obj.value = item.id
      obj.label = item.name
      obj.key = item.id
      obj.title = item.name
      if (clickType) {
        if (item.type == 2) {
          obj.disabled = true
        }
        if (clickType == 'projefct') {
          if (item.type == 3) {
            obj.disabled = true
          }
        }
      }
      obj.scopedSlots = { icon: 'custom' }
      if (item.children && item.children.length) {
        obj.children = Util.dealData(item.children, clickType)
      }
      arr.push(obj)
    })
    return arr
  }

  /**
   * 处理树结构数据 增加层级level
   * @param tree:树形结构的数据  level:树形结构的层级
   */
  Util.dealTreeData = function (tree, level) {
    let arr = []
    tree.length && tree.forEach((item, index) => {
      let obj = {}
      obj = Util.deepCopy(item)
      obj.pId = item.pid
      obj.value = item.id
      obj.label = item.name
      obj.key = item.id
      obj.title = item.name
      obj.level = level
      obj.index = index
      if (item.children && item.children.length) {
        obj.children = Util.dealTreeData(item.children, level + 1)
      }
      arr.push(obj)
    })
    return arr
  }
  /**
   * 获取树结构数据 特定的层级level
   * @param tree:树形结构的数据  level:特定层级以及特定层级一下层级
   */
  Util.getDesignTreeData = function (tree, level) {
    let arr = []
    tree.length && tree.forEach((item) => {
      let obj = {}
      obj = Util.deepCopy(item)
      if (obj.level >= level) {
        arr.push(obj)
      }
      if (item.children && item.children.length) {
        obj.children = Util.dealTreeData(item.children, level + 1)
      }
    })
    return arr
  }
 /**
   * 获取树结构数据最后一级数据
   */
  Util.getLastLevelData = function (tree) {
    let arr = []
    tree.length && tree.forEach((item) => {
      if (item.children && item.children.length) {
        arr.push(...Util.getLastLevelData(item.children))
      }else{
        arr.push(item)
      }
    })
    return arr
  }
  /**
   * 改变树级结构为普通数组对象类型
   *
   */
  Util.initTree = function (tree) {
    let arr = []
    tree.length && tree.forEach((item) => {
      if (item.children && item.children.length) {
        arr.push(...Util.initTree(item.children));
        let a = Util.deepCopy(item)
        delete a.children;
        arr.push(a);
      } else {
        arr.push(item)
      }
    })
    return arr
  }
  /**
   * 查找父级
   */
  Util.findParents = function (tree, item, isFirst) {
    let arr = [];
    if (isFirst) {
      arr.unshift({ index: item.index, id: item.id, name: item.name })
    }
    for (let i = tree.length; i--;) {
      if (item.pid == tree[i].id) {
        arr.unshift({ index: tree[i].index, id: tree[i].id })
        arr.unshift(...this.findParents(tree, tree[i], false))
      }
    }
    return arr;
  }
    /**获取树结构的所有id组成一维数组 
     * @param level:获取层级为level的所有树结构的id
     * 不传参数时,获取所有层级的id
    */
    Util.getTreeAllId = function (tree, level) {
    let arr = [];
    tree.length && tree.forEach((item) => {
      if (level) {
        if (item.level == level) {
          arr.push(item.id)
        }
      } else {
        arr.push(item.id)
      }
      if (item.children && item.children.length) {
        arr.push(...Util.getTreeAllId(item.children, level));
      }
    })
    return arr;
  }
    /**
     * 通过props获取数据对象
     * @param data 数组对象(树形/普通数组对象)
     * @param prop
     * @param keyword
     * @returns {{}}
     */
    Util.getDataByProps = function (data, prop = 'id', keyword = '') {
      let result = {}
      data.length && data.forEach((item) => {
        if (item[prop] == keyword) {
          result = Util.deepCopy(item)
        }
        if (item.children && item.children.length) {
          Util.getDataByProps(item.children, prop, keyword)[prop] && (result = Util.getDataByProps(item.children, prop, keyword));
        }
      })
      return result
    }
  /**
   * 获取最外两层ID集合
   * @param data
   * @returns {Array}
   */
  Util.getIds = function (data) {
    let arr = []
    data.length && data.forEach((item) => {
      if (item.children && item.children.length) {
        arr.push(item.id)
        item.children.forEach((item) => {
          arr.push(item.id)
        })
      }
    })
    return arr
  }
  /**
   * 处理对象填充
   * @param obj
   * @param ids
   * @returns {*}
   */
  Util.delParams = function (obj = {}, ids = []) {
    let result = typeof obj.splice === "function" ? [] : {};
    if (obj && typeof obj === 'object') {
      for (let key in obj) {
        if (obj[key] && typeof obj[key] === 'object') {
          if (ids.includes(key)) {
            result[key] = Util.deepCopy(obj[key]);//如果对象的属性值为object的时候,递归调用deepClone,即在吧某个值对象复制一份到新的对象的对应值中。
          }
        } else {
          if (ids.includes(key)) {
            result[key] = obj[key];//如果对象的属性值不为object的时候,直接复制参数对象的每一个键值到新的对象对应的键值对中。
          }
        }
      }
      return result;
    }
    return obj;
  }

  /**
   *
   * 用后面对象去填充前面对象
   */
  Util.fullObj = function (first = {}, second = {}, reserve = []) {
    for (const key in first) {
      if (reserve.includes(key)) {
        continue;
      } else {
        first[key] = second[key] || '';
      }
    }
  }
  /**
   * 全屏
   */
  Util.toggleFullScreen = function () {
    let doc = window.document
    let docEl = doc.documentElement
    let requestFullScreen =
      docEl.requestFullscreen || docEl.mozRequestFullScreen || docEl.webkitRequestFullScreen || docEl.msRequestFullscreen
    let cancelFullScreen =
      doc.exitFullscreen || doc.mozCancelFullScreen || doc.webkitExitFullscreen || doc.msExitFullscreen

    if (!doc.fullscreenElement && !doc.mozFullScreenElement && !doc.webkitFullscreenElement && !doc.msFullscreenElement) {
      requestFullScreen.call(docEl)
    } else {
      cancelFullScreen.call(doc)
    }
  }
  /**
   * 倒计时----秒
   * @param seconds 初始值
   * @param progressCallback  过程回调
   * @param finishCallback 完成回调
   */
  Util.countDown = function (seconds, progressCallback = () => {
  }, finishCallback = () => {
  }) {
    let timer = setInterval(() => {
      seconds--;
      progressCallback && progressCallback(seconds);
      if (seconds < 1) {
        clearInterval(timer);
        finishCallback && finishCallback();
      }
    }, 1000);
  }
  /**
    * 树结构查询
   * @param keyword  关键词
   * @param arr
   * @returns {Array}
   */
  Util.treeSearch = function (keyword = '', props = 'title', arr) {
    let _newarr = []
    arr.length && arr.forEach(element => {
      if (element.children && element.children.length) {
        let ab = Util.treeSearch(keyword, props, element.children)
        let obj = {
          ...element,
          children: ab
        }
        if (ab && ab.length) {
          _newarr.push(obj)
        } else {
          if (element[props].includes(keyword)) {
            _newarr.push({
              ...element,
              children: []
            })
          }
        }
      } else {
        if (element[props].includes(keyword)) {
          _newarr.push(element)
        }
      }
    })
    return _newarr
  };
  /**

   * 树结构(根据子节点 查询所有包括父节点的树结构)
   * @param ids  子节点集合
   * @param arr
   * @returns {Array}
   */
  Util.treeSearchByIds = function (ids = [], arr) {
    let _newarr = []
    arr.length && arr.forEach(element => {
      if (element.children && element.children.length) {
        let ab = Util.treeSearchByIds(ids, element.children)
        let obj = {
          ...element,
          children: ab
        }
        if (ab && ab.length) {
          _newarr.push(obj)
        } else {
          if (ids.includes(element.id)) {
            _newarr.push({
              ...element,
              children: []
            })
          }
        }
      } else {
        if (ids.includes(element.id)) {
          _newarr.push(element)
        }
      }
    })
    return _newarr
  };
  Util.getValueByKey = function (data = [], key = 'id', value = 'name', keyword) {
    let res = undefined
    data.length && data.forEach(item => {
      if (item[key] == keyword) {
        res = item[value]
      }
    })
    return res
  }

  //设置localStorage
  Util.setLocalStorage = function (key, value) {
    localStorage.setItem(key, value);
  }
  Util.getLocalStorage = function (key) {
    return localStorage.getItem(key);
  }
  Util.removeLocalStorage = function (key) {
    return localStorage.removeItem(key);
  }
  //设置localStorage
  Util.setSessionStorage = function (key, value) {
    sessionStorage.setItem(key, value);
  }
  Util.getSessionStorage = function (key) {
    return sessionStorage.getItem(key);
  }
  Util.removeSessionStorage = function (key) {
    return sessionStorage.removeItem(key);
  }
  /*
  根据文件名称判断文件类型
  * @param: fileName - 文件名称
  * @param: 数据返回 1) 无后缀匹配 - false
  * @param: 数据返回 2) 匹配图片 - image
  * @param: 数据返回 3) 匹配 txt - txt
  * @param: 数据返回 4) 匹配 excel - excel
  * @param: 数据返回 5) 匹配 word - word
  * @param: 数据返回 6) 匹配 pdf - pdf
  * @param: 数据返回 7) 匹配 ppt - ppt
  * @param: 数据返回 8) 匹配 视频 - video
  * @param: 数据返回 9) 匹配 音频 - radio
  * @param: 数据返回 10) 其他匹配项 - other
  */
  Util.getFileType = function (fileName) {
    // 后缀获取
    var suffix = '';
    // 获取类型结果
    var result = '';
    try {
      var flieArr = fileName.split('.');
      suffix = flieArr[flieArr.length - 1];
    } catch (err) {
      suffix = '';
    }
    // fileName无后缀返回 false
    if (!suffix) {
      result = false;
      return result;
    }
    // 图片格式
    var imglist = ['png', 'jpg', 'jpeg', 'bmp', 'gif'];
    // 进行图片匹配
    result = imglist.some(function (item) {
      return item == suffix;
    });
    if (result) {
      result = 'image';
      return result;
    }
    ;
    // 匹配txt
    var txtlist = ['txt'];
    result = txtlist.some(function (item) {
      return item == suffix;
    });
    if (result) {
      result = 'txt';
      return result;
    }
    ;
    // 匹配 excel
    var excelist = ['xls', 'xlsx'];
    result = excelist.some(function (item) {
      return item == suffix;
    });
    if (result) {
      result = 'excel';
      return result;
    }
    ;
    // 匹配 word
    var wordlist = ['doc', 'docx'];
    result = wordlist.some(function (item) {
      return item == suffix;
    });
    if (result) {
      result = 'word';
      return result;
    }
    ;
    // 匹配 pdf
    var pdflist = ['pdf'];
    result = pdflist.some(function (item) {
      return item == suffix;
    });
    if (result) {
      result = 'pdf';
      return result;
    }
    ;
    // 匹配 ppt
    var pptlist = ['ppt'];
    result = pptlist.some(function (item) {
      return item == suffix;
    });
    if (result) {
      result = 'ppt';
      return result;
    }
    ;
    // 匹配 视频
    var videolist = ['mp4', 'm2v', 'mkv'];
    result = videolist.some(function (item) {
      return item == suffix;
    });
    if (result) {
      result = 'video';
      return result;
    }
    ;
    // 匹配 音频
    var radiolist = ['mp3', 'wav', 'wmv'];
    result = radiolist.some(function (item) {
      return item == suffix;
    });
    if (result) {
      result = 'radio';
      return result;
    }
    // 其他 文件类型
    result = 'other';
    return result;
  }


  Util.Reg = /(^[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^0\.([0][1-9]$))|(^0\.[1-9][0-9]?)|(^0$)/   //费用可为0 0,0.1,0.01,10……
  Util.Reg2 = /(^[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^0\.([0][1-9]$))|(^0\.[1-9][0-9]?)/   //费用不能为0  0.1,0.01,10……
  Util.Reg3 = /(^[1-9]([0-9]+)?(\.[0][0]?)?$)|(^0\.0[0]?$)|(^0$)/  //正整数 + 0
  Util.Reg4 = /(^[1-9]([0-9]+)?(\.[0][0]?)?$)|(^0\.0[0]?$)/  //正整数
  Util.Reg5 = /(^[1-9]?$)|(^[1-9]\.[0-9]{1}?$)|(^0\.[1-9]{1}?$)/  //0.1-9.9
  Util.Reg6 = /(^[1-9]([0-9]+)?(\.[0][0]?)?$)|(^0\.0[0]?$)|(^0$)|(^\+?(\d*\.\d{1,4}))$/;  //保留小数点1~4位小数
  Util.Reg7 = /^[0-9A-Z]{18}$/;  //18位大写字母或数字
  Util.Reg9 = /^[0-9A-Za-z]+$/;  //18位大写字母或数字
  //Util.tel = /^((1[3,5,8][0-9])|(14[5,7])|(17[0,6,7,8])|(19[7]))\d{8}$/ //手机号验证
  Util.tel = /^1[3456789]\d{9}$/ //手机号验证
  // Util.password = /^(?=.*[a-z])(?=.*\d)(?=.*[#@!~%^&*_,./$\-=+])[a-z\d#@!~%^&*_,./$\-=+]{8,14}/i //8-16位数字、字母、特殊字符组合
  //Util.key = /(?=.*[a-z])(?=.*\d)(?=.*[#@!~%^&*_.,/$-=+])[a-z\d#@!~%^&*_.,/$-=+]{8,14}/i //8-14位数字、字母、特殊字符组合
  Util.password = Util.key = /^(?![\d]+$)(?![a-zA-Z]+$)(?![!#$%^&*,\-\./@_\+\=\(\)\~\`]+$)[\da-zA-Z!#$%^&*,\-\./@_\+\=\(\)\~\`]{8,14}$/i //8-14位(数字、字母)、(数字、字母·特殊字符)组合
  Util.age = /^([1-9]|[1-7][0-9]|80)$/ //年龄
  Util.Reg8 = /^([1-9]([0-9]+)?(\.[5][0]?)?$)|(^0\.5[0]?$)/ // 0.5 1.5
  Util.chinese = /^[\u4E00-\u9FA5]+$/ // 中文
  Util.Reg10 = /^(0|[1-9][0-9]*|-[1-9][0-9]*)$/  //正负整数 + 0
  Util.email = /^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,})$/ // 邮箱正则表达式
  Util.adminName = /^[A-Za-z0-9\u4e00-\u9fa5]+/ // 管理员名称 请输入汉字、英文、数字或其组合
  Util.adminAccount = /(?=.*[a-z])(?=.*\d)(?=.*[_])[a-z\d_]{6,18}$/i // 管理员账号 请输入6-18位字符,同时包含英文字母、数字、下划线,并且以英文字母开头
  Util.beginWidthAb = /^[a-zA-Z]+/ //以英文字母开头
  Util.iCard = /^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9X]$/   //身份证校验


  window.Util = Util
})(window)

export default {
  install: function (Vue) {
    Vue.Util
  }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值