[TOC]
>[success] # 樹形結構,根據id篩選某一條數據
項目中遇到了一個樹需要做展開收起功能,但是數據結構是樹形的(對象的屬性children又是一個對象那種)數據如下:
~~~
let data = [{
"id": "1",
"label": "第1層數據",
"code": "100001007002002",
"type": "o",
"sort": 30,
"children": [{
"id": "1.1",
"parentId": "1",
"label": "第1層數據",
"type": "u"
},
{
"id": "1.2",
"parentId": "1",
"label": "第2層數據",
"code": "100001007001001007",
"type": "o",
"sort": 30,
"children": [{
"id": "1.2.1",
"parentId": "1.2",
"label": "第3層數據",
"type": "u"
}]
}]
}]
~~~
~~~
假如現在只有一個'id'如何取到某一層的數據, 實現如下:
~~~
~~~
/**
* 根據id獲取某層節點數據
* @param {Array} arr - 要過濾的id,
* @param {Array} data - 要過濾的數據源
* @param {Array} city - 最終過濾后的返回值
*/
function getCity(arr, data, city = []) {
if (typeof data === "object") {
if(arr instanceof Array){ // 過濾條件為數組
for (let i = 0; arr[i] !== undefined; i++) {
for (let j = 0; data[j] !== undefined; j++) {
if (arr[i] === data[j].id) {
city.push(data[j]);
}
}
};
}else{ // 過濾條件不是數組
for (let j = 0; data[j] !== undefined; j++) {
if (arr === data[j].id) {
city.push(data[j]);
}
}
}
for (let i = 0; data[i] !== undefined; i++) {
getCity(arr, data[i].children, city);
};
}
return city;
}
~~~
使用時候這樣寫:
~~~
為了靈活性可以用2中傳參方式:
let filter = getCity(['1.2.1', '1.2'], data) // 1.2.1和1.2的數據
let filter = getCity('1.2.1', data) // 第三層數據
需要注意地方:
1. 如果需要過濾的數據的id是'字符串'寫的形式必須是字符串形式,如果是'number'必須是'number'形式,
不然會找不到數據的
2. 還有就是數據里的'children'和'id'有可能叫別的名字,這塊主要看數據字段名稱叫啥吧
~~~
- vue復選框邏輯
- get請求給后臺傳數組
- 提交表單時傳值參數處理方案
- Element ui上傳圖片功能
- async和await的使用
- 時間戳轉換
- 日期格式轉換時間戳
- 時間戳轉換日期格式
- 對深拷貝的認知總結
- vue-右鍵菜單功能
- textarea中換行、回車、空格的識別與處理
- element ui表格合并
- 合并行(上下行)
- 雙層for循環
- 數組去重
- 瀑布流
- 前端多條件篩選
- 閉包的理解
- 改變this指向
- vue單選框邏輯
- 對象數組根據某個屬性來進行排序
- vscode插件整理
- 對象數組多條件去重
- Blob類型數據轉換Json數據類型
- Element ui做批量上傳功能
- 前端cookie和后端cookie
- 強制轉換https協議
- 給事件傳額外參數
- 樹形結構數據處理
- 查找所有父級數據
- 根據id篩選單條數據
- 動態引入阿里圖標庫
- 四舍五入
- 封裝一個Promise.allSettled方法
- 判斷輸入框內是否有emoji表情
- element-ui的popover組件位置偏移
- formData上傳文件時,攜帶【數組對象參數】
- 前端解壓壓縮包(zip)解壓后上傳解壓的文件
- element ui表格列相同解決辦法
- elementUI,table復選框多選,翻頁/切換條數時保持選中狀態
- cookie 和 token 的區別