树形结构的处理

const data = [
  {
    "sortid": 1958,
    "syllabusid": 357,
    "contentid": 1498,
    "mlid": 1958,
    "parentid": 0,
    "content": "",
    "mltitle": "课程简介"
  },
  {
    "sortid": 1959,
    "syllabusid": 357,
    "contentid": 1499,
    "mlid": 1959,
    "parentid": 0,
    "mltitle": "一、课程性质"
  },
  {
    "sortid": 1960,
    "syllabusid": 357,
    "contentid": 1500,
    "mlid": 1960,
    "parentid": 0,
    "mltitle": "二、课程目标"
  },
  {
    "sortid": 1961,
    "syllabusid": 357,
    "contentid": 1501,
    "mlid": 1961,
    "parentid": 0,
    "mltitle": "三、课程目标对毕业要求的支撑关系"
  },
  {
    "sortid": 1962,
    "syllabusid": 357,
    "contentid": 1502,
    "mlid": 1962,
    "parentid": 0,
    "mltitle": "四、教学内容及要求"
  },
  {
    "sortid": 1963,
    "syllabusid": 357,
    "contentid": 1503,
    "mlid": 1963,
    "parentid": 0,
    "mltitle": "五、教学内容对课程目标的支撑关系"
  },
  {
    "sortid": 1964,
    "syllabusid": 357,
    "contentid": 1504,
    "mlid": 1964,
    "parentid": 0,
    "mltitle": "六、考核方式及成绩评定标准"
  },
  {
    "sortid": 1965,
    "syllabusid": 357,
    "contentid": 1505,
    "mlid": 1965,
    "parentid": 0,
    "mltitle": "七、参考书目"
  },
  {
    "sortid": 1966,
    "syllabusid": 357,
    "contentid": 1506,
    "mlid": 1966,
    "parentid": 0,
    "mltitle": "八、教学参考资源"
  },
  {
    "sortid": 1967,
    "syllabusid": 357,
    "contentid": 1507,
    "mlid": 1967,
    "parentid": 0,
    "mltitle": "九、大纲说明"
  },
  {
    "sortid": 1976,
    "syllabusid": 357,
    "contentid": 1512,
    "mlid": 1976,
    "parentid": 1958,
    "mltitle": "课程信息"
  },
  {
    "sortid": 1977,
    "syllabusid": 357,
    "contentid": 1513,
    "mlid": 1977,
    "parentid": 1958,
    "mltitle": "课程介绍"
  },
  {
    "sortid": 1978,
    "syllabusid": 357,
    "contentid": 1514,
    "mlid": 1978,
    "parentid": 1977,
    "mltitle": "介绍1"
  },
  {
    "sortid": 1979,
    "syllabusid": 357,
    "contentid": 1515,
    "mlid": 1979,
    "parentid": 1977,
    "mltitle": "介绍2"
  }
]


function toTree(data){
	if(!!data&&data.length>0){
		return data.filter(cur=>{
				let children = data.filter(o=>cur.mlid == o.parentid)
				if(!!children&&children.length>0){
					cur.children = children
				}
				return cur.parentid == 0
			});
	}
}


function toTreeFor(data, id){
	let tmpArr = []
	for(let i=0; i<data.length; i++){
		if(id == data[i].parentid){
			tmpArr.push(data[i]);
			const children = toTreeFor(data,data[i].mlid);
			if(children.length>0){
				data[i].children = children
			}
		}
	}
	return tmpArr
}


function toList(treeData, tmpArr = []){
	treeData.forEach(item=>{
		tmpArr.push(item)
		if(!!item.children && item.children.length>0){
			toList(item.children, tmpArr)
			delete item.children
		}
	})
	return tmpArr
}

// console.log(JSON.stringify(toTree(data),null,'\t'));

//console.log(JSON.stringify(toTreeFor(data,0),null,'\t'));

const treeData = toTreeFor(data,0);

console.log(JSON.stringify(toList(treeData, []),null,'\t'));



其他的一些参考

示例1:
function buildTree(items) {  
    // 1. 创建一个映射,将ID映射到对应的条目  
    const map = {};  
    items.forEach(item => map[item.id] = {...item, children: []});  
  
    // 2. 构建树形结构  
    const tree = [];  
    items.forEach(item => {  
        // 如果parentID为0,表示它是根节点  
        if (item.parentid === '0') {  
            // 直接添加到树中  
            tree.push(map[item.id]);  
        } else {  
            // 否则,找到它的父节点,并将它添加到父节点的children数组中  
            map[item.parentid].children.push(map[item.id]);  
        }  
    });  
  
    return tree;  
}  
  
// 示例数据  
const data = [  
    {id: '1958', parentid: '0', mltitle: '课程简介'},  
    {id: '1959', parentid: '0', mltitle: '一、课程性质'},  
    // ... 其他数据 ...  
    {id: '1976', parentid: '1958', mltitle: '课程信息'},  
    {id: '1977', parentid: '1958', mltitle: '课程介绍'},  
    // ... 其他数据 ...  
];  
  
// 调用函数并打印结果  
const tree = buildTree(data);  
console.log(JSON.stringify(tree, null, 2)); // 使用JSON.stringify和缩进参数来格式化输出



示例2:
function buildTreeRecursive(items, parentId = '0', tree = []) {  
    // 筛选当前parentId下的所有子项  
    const children = items.filter(item => item.parentid === parentId);  
  
    // 对每个子项进行递归处理  
    children.forEach(child => {  
        // 创建一个新的节点,并递归构建其子树  
        const node = {  
            ...child,  
            children: buildTreeRecursive(items, child.id, [])  
        };  
  
        // 将新节点添加到父节点的children数组中  
        const parent = tree.find(item => item.id === parentId);  
        if (parent) {  
            parent.children.push(node);  
        } else {  
            // 如果没有找到父节点,说明是根节点,直接添加到树中  
            tree.push(node);  
        }  
    });  
  
    return tree;  
}  
  
// 示例数据  
const data = [  
    {id: '1958', parentid: '0', mltitle: '课程简介'},  
    {id: '1959', parentid: '0', mltitle: '一、课程性质'},  
    // ... 其他数据 ...  
    {id: '1976', parentid: '1958', mltitle: '课程信息'},  
    {id: '1977', parentid: '1958', mltitle: '课程介绍'},  
    // ... 其他数据 ...  
];  
  
// 调用递归函数并打印结果  
const tree = buildTreeRecursive(data);  
console.log(JSON.stringify(tree, null, 2)); // 使用JSON.stringify和缩进参数来格式化输出