js 一维数组转成tree 对象

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<script type="text/javascript">
			
			function translateDataToTree(data) {
				  let parents = data.filter(value => value.parentId == 'undefined' || value.parentId == null)
				  let children = data.filter(value => value.parentId !== 'undefined' && value.parentId != null)
				  let translator = (parents, children) => {
					parents.forEach((parent) => {
					  children.forEach((current, index) => {
						if (current.parentId === parent.id) {
						  let temp = JSON.parse(JSON.stringify(children))
						  temp.splice(index, 1)
						  translator([current], temp)
						  typeof parent.children !== 'undefined' ? parent.children.push(current) : parent.children = [current]
						}
					  }
					  )
					}
					)
				  }
				 
				  translator(parents, children)
				 
				  return parents
				}
			/**
 * 该方法用于将有父子关系的数组转换成树形结构的数组
 * 接收一个具有父子关系的数组作为参数
 * 返回一个树形结构的数组
 */
			function translateDataToTree(data) {
			  //没有父节点的数据
			  let parents = data.filter(value => value.parentId == 'undefined' || value.parentId == null)
			 
			  //有父节点的数据
			  let children = data.filter(value => value.parentId !== 'undefined' && value.parentId != null)
			 
			  //定义转换方法的具体实现
			  let translator = (parents, children) => {
				//遍历父节点数据
				parents.forEach((parent) => {
				  //遍历子节点数据
				  children.forEach((current, index) => {
					//此时找到父节点对应的一个子节点
					if (current.parentId === parent.id) {
					  //对子节点数据进行深复制,这里只支持部分类型的数据深复制,对深复制不了解的童靴可以先去了解下深复制
					  let temp = JSON.parse(JSON.stringify(children))
					  //让当前子节点从temp中移除,temp作为新的子节点数据,这里是为了让递归时,子节点的遍历次数更少,如果父子关系的层级越多,越有利
					  temp.splice(index, 1)
					  //让当前子节点作为唯一的父节点,去递归查找其对应的子节点
					  translator([current], temp)
					  //把找到子节点放入父节点的children属性中
					  typeof parent.children !== 'undefined' ? parent.children.push(current) : parent.children = [current]
					}
				  }
				  )
				}
				)
			  }
			 
			  //调用转换方法
			  translator(parents, children)
			 
			  //返回最终的结果
			  return parents
			}
		</script>
	</body>
</html>


---------------------------------------------------------------
/*转化函数*/
function(data, attributes) {
    let resData = data;
    let tree = [];
    for(let i = 0; i < resData.length; i++) {
        if(resData[i][attributes.parentId] === attributes.rootId) {
            let obj = {
                id: resData[i][attributes.id],
                title: resData[i][attributes.name],
                children: []
            };
            tree.push(obj);
            resData.splice(i, 1);
            i--;
        }
    }
    run(tree);
 
    function run(chiArr) {
        if(resData.length !== 0) {
            for(let i = 0; i < chiArr.length; i++) {
                for(let j = 0; j < resData.length; j++) {
                    if(chiArr[i].id == resData[j][attributes.parentId]) {
                        let obj = {
                            id: resData[j][attributes.id],
                            title: resData[j][attributes.name],
                            children: []
                        };
                        chiArr[i].children.push(obj);
                        resData.splice(j, 1);
                        j--;
                    }
                }
                run(chiArr[i].children);
            }
        }
    }
 
    return tree;
 
}
1
var data=[{id:1,parentId:0,name:"测试1"},
1
{id:2,parentId:1,name:"测试2"}]
1
2
3
4
5
<em id="__mceDel"><br>let attributes = {    //定义数据属性名称
id: 'id',
parentId: 'parentId',
name: 'groupName',<br>rootId: 0
}<br>/*调用*/<br>formatTreeData(data,attributes);<br></em>

  

  

原文地址:https://www.cnblogs.com/qq735675958/p/10513695.html