在实际的工作和业务需求中,我们经常会碰到树形数据结构,比如公司组织架构、组织层级、省市县或者事物的分类等等数据。那么在JavaScript中如何将数组转为树形结构和树形结构转为数组,本文就详细的来探究一下。
先来看看给出了一组怎样的数据,转换为怎样的树形结构。
后台接口返回或者面试官给你的数据:
期望的处理后的数据:
如果后台给了一个这样的数据说让前端自己去转换为树形结构或者面试官给你一组这样的数据让你手写一个转换方法,你会怎么处理?
1、递归实现
2、Map对象实现
3、filter实现
这种方法很有意思,可能大多数人想不到,也是从大佬处学到的(读书人的是怎么能叫抄呢,应该叫“窃”)。
1、reduce取树行数据的所有子集
2、递归实现
3、广度优先遍历法
这个可以理解写为有限深层的拷贝
var Deep,ID = '1-1',After = []~function(List,Level)
{
var T,F
for (F = List.lengthF)
{
T = List[--F]
if (ID === T.id)
{
Deep = Level
return !0
}
if (T.children)
if (arguments.callee(T.children,Level + 1))
return !0
}
}(a,1)
//现在已经得到指定ID的深度了
~function(From,To,Deep)
{
var C,T,F,Fa
--Deep
for (F = 0F < From.length++F)
{
T = From[F]
To.push(C = {})
for (Fa in T) /^children$/.test(Fa) || (C[Fa] = T[Fa])
if (Deep) arguments.callee(T.children,C.children = [],Deep)
}
}(a,After,Deep)
console.log(After)
//传入要查找的数据集,目标id,返回目标ID对应的数据集合//jsonData:数据集
//destID:目标ID
//json:目标ID结果集
function GetSubJson(jsonData, destID, json) {
for (var i = 0i <jsonData.lengthi++) {
if (jsonData[i].id == destID)
json.push(jsonData[i])
else {
if (jsonData[i].hasOwnProperty("children")) {
GetSubJson(jsonData[i].children, destID, json)
}
}
}
}
//例如
var json = []
GetSubJson(a, "2016", json)