* **平扁化,解決flat()兼容問題**
*****
```
export function flattenDeep(arr?=?[])?{
return arr.reduce((acc,?val)?=>Array.isArray(val)???acc.concat(flattenDeep(val))?:?acc.concat(val),?[])
}
```
* **深拷貝**
*****
了解更多,請點擊[這里](http://www.hmoore.net/vvmily_king/vvmily/2306112)
```
export function deepClone(obj) {
var newObj = Array.isArray(obj) ? [] : {};
for(var key in obj){
if(obj[key] && typeof obj[key] === 'object'){
newObj[key] = deepClone(obj[key])
}else{
newObj[key] = obj[key]
}
}
return newObj;
}
```
* **解析URL中的參數**
```
export const parseUrlParams =(params) => {
let url = params.substring(params.indexOf("?")); //獲取url中"?"符后的字串
let result = {};
if?(url.indexOf("?")?!=-1)?{
let str = url.substr(1);
let strs = str.split("&");
for?(leti = 0; i < strs.length; i++)?{
result[strs[i].split("=")[0]]?= unescape(strs[i].split("=")[1]);
}
}
return result;
}
```
* **一維數組轉樹結構**
```
/**
?*?一維數組轉樹結構
?*?@param?{*}?data?一維數組
?*?@param?{*}?id?當前id
?*?@param?{*}?pid?父級關聯id
?*?@param?{*}?children?子級數組鍵
?*?@returns?樹形Array
?*/
export?function?toTree(
??data,
??id?=?'menuId',
??pid?=?'parentId',
??children?=?'children'
)?{
??const?result?=?[]
??if?(!Array.isArray(data))?{
????return?result
??}
??data.forEach(item?=>?{
????delete?item[children]
??})
??const?map?=?{}
??data.forEach(item?=>?{
????map[item[id]]?=?item
??})
??data.forEach(item?=>?{
????const?parent?=?map[item[pid]]
????item.parentName?=?(parent?||?{}).menuName
????item.parentId?=?(parent?||?{}).menuId
????if?(parent)?{
??????(parent[children]?||?(parent[children]?=?[])).push(item)
????}?else?{
??????result.push(item)
????}
??})
??return?result
}
```
* **查找數組樹形數組一級最后一級的第一項**
```
/**
?*?查找數組樹形數組一級最后一級的第一項
?*?@param?{*}?arr?樹形數組
?*?@param?{*}?children?樹下級
?*?@returns?Array
?*/
export?function?arrayFirstById(arr?=?[],?children?=?'children')?{
??return?arr.reduce((pre,?cur)?=>?{
????pre.push(cur)
????return?pre.concat(
??????cur[children]?&&?cur[children].length???arrayFirstById(cur[children])?:?[]
????)
??},?[])
}
```
* **查找樹結構,當前id的所有上級id**
```
/**
?*?從下往上查找
?*?查找樹結構,當前id的所有上級id
?*?@param?{*}?treeData?樹結構?數組,必傳
?*?@param?{*}?id?當前id?,必傳
?*?@param?{*}?key?與id相匹配的鍵
?*?@param?{*}?children?樹結構下級
?*?@returns?Array
?*/
export?function?findTreeParents(
??treeData,
??id,
??key?=?'id',
??children?=?'children'
)?{
??if?(treeData.length?===?0)?return
??for?(let?i?=?0;?i?<?treeData.length;?i++)?{
????if?(treeData[i][key]?===?id)?{
??????return?[]
????}?else?{
??????if?(treeData[i][children])?{
????????const?res?=?findTreeParents(treeData[i][children],?id)
????????if?(res?!==?undefined)?{
??????????return?res.concat(treeData[i])
????????}
??????}
????}
??}
}
```
* **找樹結構,當前id的所有上級id**
```
/**
?*?通過子級parentId與父級id相對應,從上往下查找
?*?找樹結構,當前id的所有上級id
?*?@param?{*}?treeData?樹結構?數組,必傳
?*?@param?{*}?id?當前id?,必傳
?*?@param?{*}?option?配置項
?*?@returns?Array
?*/
export?function?treeFindParentById(treeData,?id,?option)?{
??const?{?key,?children,?parentId?}?=?{
????key:?'id',
????children:?'children',
????parentId:?'parentId',
????...option
??}
??const?allParents?=?[]
??if?(treeData.length?===?0)?{
????return?[]
??}
??const?findParents?=?(data,?id)?=>?{
????if?(!id)?return
????data.forEach((item,?index)?=>?{
??????if?(item[key]?===?id)?{
????????allParents.unshift(item)
????????findParents(treeData,?item[parentId])
??????}?else?{
????????if?(item.children)?{
??????????findParents(item[children],?id)
????????}
??????}
????})
??}
??findParents(treeData,?id)
??return?allParents
}
```
工具類驗證:https://www.helloweba.net/javascript/639.html
- 首頁
- 2021年
- 基礎知識
- 同源策略
- 跨域
- css
- less
- scss
- reset
- 超出文本顯示省略號
- 默認滾動條
- 清除浮動
- line-height與vertical-align
- box-sizing
- 動畫
- 布局
- JavaScript
- 設計模式
- 深淺拷貝
- 排序
- canvas
- 防抖節流
- 獲取屏幕/可視區域寬高
- 正則
- 重繪重排
- rem換算
- 手寫算法
- apply、call和bind原理與實現
- this的理解-普通函數、箭頭函數
- node
- nodejs
- express
- koa
- egg
- 基于nodeJS的全棧項目
- 小程序
- 常見問題
- ec-canvas之橫豎屏切換重繪
- 公眾號后臺基本配置
- 小程序發布協議更新
- 小程序引入iconfont字體
- Uni-app
- 環境搭建
- 項目搭建
- 數據庫
- MySQL數據庫安裝
- 數據庫圖形化界面常用命令行
- cmd命令行操作數據庫
- Redis安裝
- APP
- 控制縮放meta
- GIT
- 常用命令
- vsCode
- 常用插件
- Ajax
- axios-services
- 文章
- 如何讓代碼更加優雅
- 虛擬滾動
- 網站收藏
- 防抖節流之定時器清除問題
- 號稱破解全網會員的腳本
- 資料筆記
- 資料筆記2
- 公司面試題
- 服務器相關
- 前端自動化部署-jenkins
- nginx.conf配置
- https添加證書
- shell基本命令
- 微型ssh-deploy前端部署插件
- webpack
- 深入理解loader
- 深入理解plugin
- webpack注意事項
- vite和webpack區別
- React
- react+antd搭建
- Vue
- vue-cli
- vue.config.js
- 面板分割左右拖動
- vvmily-admin-template
- v-if與v-for那個優先級高?
- 下載excel
- 導入excel
- Echart-China-Map
- vue-xlsx(解析excel)
- 給elementUI的el-table添加骨架
- cdn引入配置
- Vue2.x之defineProperty應用
- 徹底弄懂diff算法的key作用
- 復制模板內容
- 表格操作按鈕太多
- element常用組件二次封裝
- Vue3.x
- Vue3快速上手(第一天)
- Vue3.x快速上手(第二天)
- Vue3.x快速上手(第三天)
- vue3+element-plus搭建項目
- vue3
- 腳手架
- vvmily-cli
- TS
- ts筆記
- common
- Date
- utils
- axios封裝
- 2022年
- HTML
- CSS基礎
- JavaScript 基礎
- 前端框架Vue
- 計算機網絡
- 瀏覽器相關
- 性能優化
- js手寫代碼
- 前端安全
- 前端算法
- 前端構建與編譯
- 操作系統
- Node.js
- 一些開放問題、智力題