JavaScript将数组转为树形结构
Posted 兰村_web
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript将数组转为树形结构相关的知识,希望对你有一定的参考价值。
javascript将数组转为树形结构
1.需求
后台给了一个这样的数据让咱前端去转换为树形结构(没有重复数据)。不多说,先来看看给了一个怎样的数组数据,转换为怎样的树形结构。
服务器传过来的数组
const arr = [
[
"deptId":"D019",
"deptName":"销售部",
"deptId":"D019101",
"deptName":"华北销售中心"
],[
"deptId":"D083",
"deptName":"音乐事业部"
],[
"deptId":"D027",
"deptName":"杭州研究院",
"deptId":"D027048",
"deptName":"技术工程事业部",
"deptId":"D027048002",
"deptName":"项目管理中心"
],[
"deptId":"D027",
"deptName":"杭州研究院",
"deptId":"D027048",
"deptName":"技术工程事业部"
],[
"deptId":"D027",
"deptName":"杭州研究院",
"deptId":"D027048",
"deptName":"技术工程事业部"
]
]
最终转换为
const arr = [
deptId: 'D019',
deptName: '销售部',
children: [
deptId: 'D019101',
deptName: '华北销售中心',
children: [],
]
,
deptId: 'D083',
deptName: '音乐事业部',
children: []
,
deptId: 'D027',
deptName: '杭州研究院',
children: [
deptId: 'D027048',
deptName: '技术工程事业部',
children: [
deptId: 'D027048002',
deptName: '项目管理中心',
children: []
]
]
,
]
2.上代码(在reactHooks中开发)
const [treeData, setTreeData] = useState([]);
console.log(treeData); //treeData为最终需要的树形结构,(在我本地浏览器打印出来是正确的)
useEffect(() =>
const str = '[["deptId":"D019","deptName":"销售部","deptId":"D019101","deptName":"华北销售中心"],["deptId":"D019","deptName":"销售部","deptId":"D019101","deptName":"华北销售中心"],["deptId":"D083","deptName":"音乐事业部"],["deptId":"D027","deptName":"杭州研究院","deptId":"D027048","deptName":"技术工程事业部","deptId":"D027048002","deptName":"项目管理与效能中心"],["deptId":"D027","deptName":"杭州研究院","deptId":"D027048","deptName":"技术工程事业部"],["deptId":"D027","deptName":"杭州研究院","deptId":"D027048","deptName":"技术工程事业部"]]';
const arr = JSON.parse(str).flat(); //扁平化
let newArr = [];
noRepeat(arr).length && noRepeat(arr).forEach(it =>
appendChild(it, newArr);
);
, [])
const noRepeat = (arr) => //去重
let newobj = ;
return arr.reduce((preVal, curVal) =>
newobj[curVal.deptId] ? '' : newobj[curVal.deptId] = preVal.push(curVal);
return preVal
, []);
const appendChild = (item, newArr) =>
if(!newArr.find(it => item.deptId.indexOf(it.deptId) > -1)) //所有一级部门
newArr.push(
deptId: item.deptId,
deptName: item.deptName,
children: [],
);
setTreeData(newArr);
else
appendOtherChild(item, newArr);
const appendOtherChild = (item, newArr) =>
newArr.map(it =>
if(item.deptId.indexOf(it.deptId) > -1 && item.deptId.length === it.deptId.length+3)
it.children.push(
deptId: item.deptId,
deptName: item.deptName,
children: [],
)
else
appendOtherChild(item, it.children);
);
setTreeData(newArr);
总结
可能这些数据和你的不太一样,但是逻辑可能八九不离十,可以好好看一下这几十行代码,如果能学到一丁丁小东西,如果你正好也登录着,还希望给点个小赞赞哈!
以上是关于JavaScript将数组转为树形结构的主要内容,如果未能解决你的问题,请参考以下文章