国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

前端工具函數(shù)

Channe / 816人閱讀

摘要:將一級(jí)的數(shù)據(jù)結(jié)構(gòu)處理成樹狀數(shù)據(jù)結(jié)構(gòu)處理成樹狀結(jié)構(gòu),一般就是需要節(jié)點(diǎn)和父節(jié)點(diǎn)標(biāo)識(shí),或者需要考慮以哪個(gè)節(jié)點(diǎn)為根節(jié)點(diǎn)生成樹結(jié)構(gòu)數(shù)據(jù)使用示例代碼將一級(jí)的數(shù)據(jù)結(jié)構(gòu)處理成樹狀數(shù)據(jù)結(jié)構(gòu)字段名稱比如父字段名稱比如根節(jié)點(diǎn)的父字段的值需要處理的數(shù)據(jù)是否深復(fù)制數(shù)

將一級(jí)的數(shù)據(jù)結(jié)構(gòu)處理成樹狀數(shù)據(jù)結(jié)構(gòu)
處理成樹狀結(jié)構(gòu),一般就是需要節(jié)點(diǎn)和父節(jié)點(diǎn)標(biāo)識(shí),或者需要考慮以哪個(gè)節(jié)點(diǎn)為根節(jié)點(diǎn)生成樹結(jié)構(gòu)數(shù)據(jù)
// 使用示例代碼:
list: [{id: 1, pid: 0, name: 11}, {id: 2, pid: 1, name: 2}]
getTreeArr({ key: "id", pKey: "pid", data: list })
result: [
    {id: 1, pid: 0, name: 11, children: [
        {id: 2, pid: 1, name: 2}
    ]}
]
  /**
 * 將一級(jí)的數(shù)據(jù)結(jié)構(gòu)處理成樹狀數(shù)據(jù)結(jié)構(gòu)
 * @param {Object} obj {key, pKey, data}
 *  @param obj.key  字段名稱 比如id
 *  @param obj.pKey 父字段名稱 比如 pid
 *  @param obj.rootPValue 根節(jié)點(diǎn)的父字段的值
 *  @param obj.data 需要處理的數(shù)據(jù)
 *  @param obj.jsonData 是否深復(fù)制數(shù)據(jù)(默認(rèn)是true)
 * @return {Array} arr
   */
  getTreeArr: (obj) => {
    if (!Array.isArray(obj.data)) {
      console.log("getTreeArr=>請(qǐng)傳入數(shù)組")
      return []
    }
    obj.jsonData = obj.jsonData === false ? obj.jsonData : true
    const arr = obj.jsonData ? JSON.parse(JSON.stringify(obj.data)) : obj.data
    const arr1 = []
    // 將數(shù)據(jù)處理成數(shù)狀結(jié)構(gòu)
    arr.forEach(item => {
      let index = 0
      item.children = []
      arr.forEach(item1 => {
        // 得到樹結(jié)構(gòu)關(guān)系
        if (item[obj.key] === item1[obj.pKey]) {
          item.children.push(item1)
        }
        // 判斷根節(jié)點(diǎn)
        if (item1[obj.key] !== item[obj.pKey]) {
          index++
        }
      })
      // 沒傳入根節(jié)點(diǎn),根據(jù)當(dāng)前數(shù)據(jù)結(jié)構(gòu)得到根節(jié)點(diǎn)
      if (!("rootPValue" in obj) && index === arr.length) {
        arr1.push(item)
      }
    })
    // 傳入根節(jié)點(diǎn),根據(jù)傳入的根節(jié)點(diǎn)組成樹結(jié)構(gòu)
    if ("rootPValue" in obj) {
      arr.forEach(item => {
        if (item[obj.pKey] === obj.rootPValue) {
          arr1.push(item)
        }
      })
    }
    return arr1
  }
數(shù)組去重
數(shù)組去重方法有許多,還分為普通數(shù)組和對(duì)象數(shù)組,這里列舉了一些,并把其中優(yōu)缺點(diǎn)分析了一下
  /**
   * 數(shù)組去重
   * @param {Array} data 要去重的數(shù)組
   * @param {String} key 作為去重依據(jù)的字段 (處理對(duì)象數(shù)組時(shí)需要傳入)
   * @return arr 返回處理后的數(shù)據(jù)
   */
根據(jù)對(duì)象的屬性不同去重

推薦使用

  handleRepeatArr ({ data, key }) {
    if (!Array.isArray(data)) {
      console.log("請(qǐng)傳入數(shù)組")
      return
    }
    const arr = []; const obj = {}
    data.forEach((item, index) => {
      const attr = key ? item[key] : item
      if (!obj[attr]) {
        obj[attr] = index + 1
        arr.push(item)
      }
    })
    return arr
  }
遞歸去重

缺點(diǎn):會(huì)將數(shù)據(jù)默認(rèn)排序

  handleRepeatArr ({ data, key }) {
    if (!Array.isArray(data)) {
      console.log("請(qǐng)傳入數(shù)組")
      return
    }
    /** 1.遞歸去重,缺點(diǎn),會(huì)將數(shù)據(jù)默認(rèn)排序 */
    // 先對(duì)數(shù)據(jù)做排序處理
    data = data.sort((item, item1) => {
      if (key) {
        return item[key] - item1[key]
      }
      return item - item1
    })
    // 遞歸去重
    function getData (index) {
      if (index >= 1) {
        // 判斷當(dāng)前數(shù)據(jù)和下一條數(shù)據(jù)是否相等
        let result = key ? data[index][key] === data[index - 1][key] : data[index] === data[index - 1]
        if (result) {
          data.splice(index, 1)
        }
        getData(index - 1)
      }
    }
    getData(data.length - 1)
    return data
  }
利用indexOf以及forEach

缺點(diǎn):適合處理數(shù)組,不適合處理對(duì)象數(shù)組

  handleRepeatArr ({ data, key }) {
    if (!Array.isArray(data)) {
      console.log("請(qǐng)傳入數(shù)組")
      return
    }
    let arr = []
    data.forEach((item, index) => {
      // 如果當(dāng)前元素在之后沒有出現(xiàn)過(后面出現(xiàn)的數(shù)據(jù)會(huì)保留)
      // let result = data.indexOf(item, index + 1)
      // 如果當(dāng)前元素在之前沒有出現(xiàn)過(前面出現(xiàn)的數(shù)據(jù)會(huì)保留)
      let result = index === 0 ? -1 : data.lastIndexOf(item, index - 1)
      if (result === -1) {
        arr.push(item)
      }
    })
    return arr
  }
new Set

缺點(diǎn):適合處理數(shù)組,不適合處理對(duì)象數(shù)組

return [...new Set(data)]
雙層循環(huán)去重

缺點(diǎn):占用內(nèi)存高

  handleRepeatArr ({ data, key }) {
    if (!Array.isArray(data)) {
      console.log("請(qǐng)傳入數(shù)組")
      return
    }
    for (let i = 0, len = data.length; i < len; i++) {
      for (let j = i + 1; j < len; j++) {
        let result = key ? data[i][key] === data[j][key] : data[i] === data[j]
        if (result) {
          data.splice(j, 1)
          len--
          j--
        }
      }
    }
    return data
  }
復(fù)制內(nèi)容

復(fù)制成功后如果需要提示,需要自定義相關(guān)回調(diào),當(dāng)前函數(shù)使用的是element-ui的彈窗

  /**
   * 復(fù)制
   * @param {String} value 要復(fù)制的值
   */
  copyData (value) {
    const inputDom = document.createElement("input")
    inputDom.value = value
    document.body.appendChild(inputDom)
    inputDom.select() // 選擇對(duì)象
    document.execCommand("Copy") // 執(zhí)行瀏覽器復(fù)制命令
    document.body.removeChild(inputDom) // 刪除DOM
    Message({
      type: "success",
      message: "復(fù)制成功"
    })
  }
a模擬window.open打開窗口

因?yàn)橛行g覽器會(huì)默認(rèn)攔截window.open,當(dāng)需要函數(shù)中打開窗口,可以使用a標(biāo)簽?zāi)Mwindow.open

  /**
   * a模擬window.open,不會(huì)被瀏覽器攔截
   * @param {String} url        a標(biāo)簽打開的地址
   * @param {String} id         a標(biāo)簽的ID
   * @param {String} targetType a標(biāo)簽點(diǎn)擊打開的方式(當(dāng)前頁面打開還是新窗口打開)
   */
  openWindow: (url, targetType = "_blank", id = "open", download = false) => {
    // 如果存在則刪除
    if (document.getElementById(id)) {
      document.body.removeChild(document.getElementById(id))
    }
    const a = document.createElement("a")
    a.setAttribute("href", url)
    if (download) {
      a.setAttribute("download", url)
    }
    a.setAttribute("target", targetType)
    a.setAttribute("id", id)
    document.body.appendChild(a)
    a.click()
  }
得到想要的時(shí)間格式

這個(gè)在業(yè)務(wù)中用的比較頻繁

// 使用示例代碼:
switchTime(new Date(), "YYYY-MM-DD hh") // 返回 2019-05-22 11
switchTime(new Date(), "YYYYMMDD hh:mm:ss") // 返回 20190522 11:00:00
  /**
   * 傳入時(shí)間戳,轉(zhuǎn)換指定的時(shí)間格式
   * @param {Number} val      時(shí)間戳
   * @param {String} dateType 要得到的時(shí)間格式 例如 YYYY-MM-DD hh:mm:ss
   * @return dataStr 例如 YYYY-MM-DD hh:mm:ss
   */
  switchTime: (val = +new Date(), dateType = "YYYY-MM-DD hh:mm:ss") => {
    // 將字符串轉(zhuǎn)換成數(shù)字
    const timeStamp = +new Date(val)

    // 如果轉(zhuǎn)換成數(shù)字出錯(cuò)
    if (!timeStamp) {
      return val
    }
    let str
    // 得到時(shí)間字符串
    const dateStr = new Date(timeStamp)
    str = dateType.replace("YYYY", dateStr.getFullYear())
    str = str.replace("MM", (dateStr.getMonth() + 1 < 10 ? "0" : "") + (dateStr.getMonth() + 1))
    str = str.replace("DD", (dateStr.getDate() < 10 ? "0" : "") + dateStr.getDate())
    str = str.replace("hh", (dateStr.getHours() < 10 ? "0" : "") + dateStr.getHours())
    str = str.replace("mm", (dateStr.getMinutes() < 10 ? "0" : "") + dateStr.getMinutes())
    str = str.replace("ss", (dateStr.getSeconds() < 10 ? "0" : "") + dateStr.getSeconds())

    return str
  }
時(shí)間顯示轉(zhuǎn)換

這個(gè)方法中需要應(yīng)用到上一個(gè)方法,獲取當(dāng)前時(shí)間,或者可以自行得到時(shí)間然后再去處理

假設(shè)當(dāng)前時(shí)間為 2019-05-20 00:00:00
// 使用示例代碼:
timeView(new Date()) // 剛剛發(fā)布
timeView("2019-05-19 23:01:00") // 59分鐘前
timeView("2019-05-19 12:00:00") // 12小時(shí)前
timeView("2019-05-15 12:00:00") // 5天前
timeView("2019-04-15 12:00:00") // 04-15
timeView("2018-04-15 12:00:00") // 2018-04-15
  /**
   * 時(shí)間顯示
   */
  timeView: function (val) {
    const now = +new Date() // 當(dāng)時(shí)時(shí)間
    const timeStamp = +new Date(val) // 需要處理的時(shí)間
    const result = now - timeStamp // 相差的時(shí)間戳
    const min = 60 * 1000 // 分鐘的毫秒數(shù)
    const hour = 60 * 60 * 1000 // 小時(shí)的毫秒數(shù)
    const day = 60 * 60 * 1000 * 24 // 日的毫秒數(shù)
    if (result / min < 1) {
      return "剛剛發(fā)布"
    } else if (result / min < 60) {
      return Math.floor(result / min) + "分鐘前"
    } else if (result / hour > 1 && result / hour < 24) {
      return Math.floor(result / hour) + "小時(shí)前"
    } else if (result / day > 1 && result / day < 7) {
      return Math.floor(result / day) + "天前"
    } else if (this.switchTime(now, "YYYY") === this.switchTime(timeStamp, "YYYY")) {
      return this.switchTime(timeStamp, "MM月DD日")
    } else {
      return this.switchTime(timeStamp, "YYYY年MM月DD日")
    }
  }
處理搜索欄參數(shù)
  getLocationSearch () {
    const str = window.location.search
    const arr = str.substr(1).split("&")
    const obj = {}
    for (const item of arr) {
      const data = item.split("=")
      obj[data[0]] = data[1]
    }
    return obj
  }
文件大小顯示轉(zhuǎn)換
  bytesToSize (bytes) {
    if (bytes === 0) return "0 B"
    var k = 1024 // or 1024
    var sizes = ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"]
    var i = Math.floor(Math.log(bytes) / Math.log(k))
    return (bytes / Math.pow(k, i)).toPrecision(3) + " " + sizes[i]
  }
對(duì)請(qǐng)求失敗的HTTP狀態(tài)碼做處理
  /**
   * 對(duì)請(qǐng)求失敗的HTTP狀態(tài)碼做處理
   * @param {Number} code     HTTP狀態(tài)碼
   * @param {String} message  錯(cuò)誤提示
   * @return message 返回處理過的提示信息
   */
  requestError: (code, message) => {
    const statusCode = (code + "").replace(/[^0-9]+/g, "") - 0

    switch (statusCode) {
      case 400:
        return "Bad Request (錯(cuò)誤的請(qǐng)求)"
      case 401:
        return "Unauthorized (請(qǐng)求要求身份驗(yàn)證)"
      case 403:
        return "Forbidden (服務(wù)器拒絕請(qǐng)求)"
      case 404:
        return "NOT Found (服務(wù)器找不到請(qǐng)求的資源)"
      case 405:
        return "Bad Request (禁用請(qǐng)求中指定的方法)"
      case 406:
        return "Not Acceptable (無法使用請(qǐng)求的內(nèi)容特性響應(yīng)請(qǐng)求的網(wǎng)頁)"
      case 407:
        return "Proxy Authentication Required (需要代理授權(quán))"
      case 408:
        return "Request Timed-Out (服務(wù)器等候請(qǐng)求時(shí)發(fā)生超時(shí))"
      case 409:
        return "Conflict (服務(wù)器在完成請(qǐng)求時(shí)發(fā)生沖突。服務(wù)器必須在響應(yīng)中包含有關(guān)沖突的信息)"
      case 410:
        return "Gone (請(qǐng)求的資源已被永久刪除)"
      case 411:
        return "Length Required (服務(wù)器不接受不含有效內(nèi)容長(zhǎng)度標(biāo)頭字段的請(qǐng)求)"
      case 412:
        return "Precondition Failed (未滿足前提條件)"
      case 413:
        return "Request Entity Too Large (請(qǐng)求實(shí)體過大)"
      case 414:
        return "Request, URI Too Large (請(qǐng)求的 URI 過長(zhǎng))"
      case 415:
        return "Unsupported Media Type (不支持的媒體類型)"
      case 429:
        return "您的操作過于頻繁,請(qǐng)稍后重試"
      case 500:
        return "Internal Server Error (服務(wù)器內(nèi)部錯(cuò)誤)"
      case 501:
        return "Not Implemented (尚未實(shí)施)"
      case 502:
        return "Bad Gateway (錯(cuò)誤網(wǎng)關(guān))"
      case 503:
        return "Server Unavailable (服務(wù)不可用)"
      case 504:
        return "Gateway Timed-Out (網(wǎng)關(guān)超時(shí))"
      case 505:
        return "HTTP Version not supported (HTTP 版本不受支持)"
      default:
        return message
    }
  }
通過key找到在列表中對(duì)應(yīng)的名字
// 使用示例代碼:
list: [{key: "紅色", value: 1}]
getDataName({dataList: list, value: "value", label: "key", data: 1}) // 紅色
  /**
   * 通過key找到在列表中對(duì)應(yīng)的顯示
   * @param {Object} obj
   *  @param obj.dataList 數(shù)據(jù)列表
   *  @param obj.value    數(shù)據(jù)的值對(duì)應(yīng)的字段名稱   例如 "value"
   *  @param obj.label    數(shù)據(jù)的說明對(duì)應(yīng)的字段名稱 例如 "label"
   *  @param obj.data     當(dāng)前傳入的數(shù)據(jù)值
   * @return name        返回當(dāng)前傳入值在數(shù)組中對(duì)應(yīng)的名字
   */
  getDataName: (obj) => {
    let name = obj.data
    if (Array.isArray(obj.dataList) && obj.dataList.length > 0) {
      for (let i = 0; i < obj.dataList.length; i++) {
        if (obj.dataList[i][obj.value] === obj.data) {
          name = obj.dataList[i][obj.label]
        }
      }
    }
    return name
  }
代碼地址

工具庫地址

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/109728.html

相關(guān)文章

  • 前端面試題(3)現(xiàn)代技術(shù)

    摘要:什么是單頁面應(yīng)用單頁面應(yīng)用是指用戶在瀏覽器加載單一的頁面,后續(xù)請(qǐng)求都無需再離開此頁目標(biāo)旨在用為用戶提供了更接近本地移動(dòng)或桌面應(yīng)用程序的體驗(yàn)。流程第一次請(qǐng)求時(shí),將導(dǎo)航頁傳輸?shù)娇蛻舳耍溆嗾?qǐng)求通過獲取數(shù)據(jù)實(shí)現(xiàn)數(shù)據(jù)的傳輸通過或遠(yuǎn)程過程調(diào)用。 什么是單頁面應(yīng)用(SPA)? 單頁面應(yīng)用(SPA)是指用戶在瀏覽器加載單一的HTML頁面,后續(xù)請(qǐng)求都無需再離開此頁 目標(biāo):旨在用為用戶提供了更接近本地...

    EasonTyler 評(píng)論0 收藏0
  • 前端面試題(3)現(xiàn)代技術(shù)

    摘要:什么是單頁面應(yīng)用單頁面應(yīng)用是指用戶在瀏覽器加載單一的頁面,后續(xù)請(qǐng)求都無需再離開此頁目標(biāo)旨在用為用戶提供了更接近本地移動(dòng)或桌面應(yīng)用程序的體驗(yàn)。流程第一次請(qǐng)求時(shí),將導(dǎo)航頁傳輸?shù)娇蛻舳耍溆嗾?qǐng)求通過獲取數(shù)據(jù)實(shí)現(xiàn)數(shù)據(jù)的傳輸通過或遠(yuǎn)程過程調(diào)用。 什么是單頁面應(yīng)用(SPA)? 單頁面應(yīng)用(SPA)是指用戶在瀏覽器加載單一的HTML頁面,后續(xù)請(qǐng)求都無需再離開此頁 目標(biāo):旨在用為用戶提供了更接近本地...

    trigkit4 評(píng)論0 收藏0
  • 前端開發(fā)知識(shí)點(diǎn)整理

    摘要:前言本文主要是有關(guān)前端方面知識(shí)按照目前的認(rèn)知進(jìn)行的收集歸類概括和整理,涵蓋前端理論與前端實(shí)踐兩方面。 前言:本文主要是有關(guān)前端方面知識(shí)按照 XX 目前的認(rèn)知進(jìn)行的收集、歸類、概括和整理,涵蓋『前端理論』與『前端實(shí)踐』兩方面。本文會(huì)告訴你前端需要了解的知識(shí)大致有什么,看上去有很多,但具體你要學(xué)什么,還是要 follow your heart & follow your BOSS。 初衷...

    Blackjun 評(píng)論0 收藏0
  • 前端開發(fā)知識(shí)點(diǎn)整理

    摘要:前言本文主要是有關(guān)前端方面知識(shí)按照目前的認(rèn)知進(jìn)行的收集歸類概括和整理,涵蓋前端理論與前端實(shí)踐兩方面。 前言:本文主要是有關(guān)前端方面知識(shí)按照 XX 目前的認(rèn)知進(jìn)行的收集、歸類、概括和整理,涵蓋『前端理論』與『前端實(shí)踐』兩方面。本文會(huì)告訴你前端需要了解的知識(shí)大致有什么,看上去有很多,但具體你要學(xué)什么,還是要 follow your heart & follow your BOSS。 初衷...

    Sike 評(píng)論0 收藏0
  • 前端開發(fā)知識(shí)點(diǎn)整理

    摘要:前言本文主要是有關(guān)前端方面知識(shí)按照目前的認(rèn)知進(jìn)行的收集歸類概括和整理,涵蓋前端理論與前端實(shí)踐兩方面。 前言:本文主要是有關(guān)前端方面知識(shí)按照 XX 目前的認(rèn)知進(jìn)行的收集、歸類、概括和整理,涵蓋『前端理論』與『前端實(shí)踐』兩方面。本文會(huì)告訴你前端需要了解的知識(shí)大致有什么,看上去有很多,但具體你要學(xué)什么,還是要 follow your heart & follow your BOSS。 初衷...

    tracy 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<