一、问题

有这样的一个数据结构:

[{
"children": [
{
"children": [
{
"content2": [],
"id": 305540,
"level": 2,
"name": "知识演练场",
"type": 201
},
{
"content2": [],
"id": 305541,
"level": 2,
"module": 13,
"name": "智慧加油站",
"type": 201
}
],
"id": 305539,
"level": 1,
"name": "天天练",
"type": 0
},
{
"content2": [],
"id": 305542,
"level": 1,
"name": "随堂测",
"type": 201
}
],
"id": 305538,
"level": 0,

"name": "第1课时 认识秒",
"type": 0
}]

由以上数据可知,该数据是一种树形结构,要拼接每个叶子节点的数据,放到一个数组里

二、思路

1、 传入的数据为空数组时,返回

2、声明空数组 topics

2、遍历当前节点的所有子节点

(1) 若当前节点是末端节点,说明这棵树递归完了,创建一个新对象,设置 name 为:父节点 name + 子节点 name, 设置习题为该节点下的习题字段内容, 把新对象放进 topics 里

(2) 若该节点位于第一层,说明是单元名,name 设置为空

(3) 若当前节点不是末端节点,递归该节点,传入当前节点和拼接的新 name 给子节点

(4) 遍历完毕,返回 topics

三、实现

function buildTopicWithSection (courseware, name = []) {
// @param
// courseware: []
// name: []
// return: []
let topics = [];
if (!courseware) {
return [];
}
for (let k = 0; k < courseware.length; k++) {
let ele = courseware[k];
if (ele.content2) {
ele.name = name.concat([ele.name]).join(' ');
ele.topics = [];
for (let i = 0; i < ele.content2.length; i++) {
for (let j = 0; j < ele.content2[i].exercise.length; j++) {
ele.topics.push(ele.content2[i].exercise[j]);
}
}
delete ele.content2;
topics.push(ele);
}
const newName = ele.level === 0 ? [] : name.concat([ele.name]);
topics = topics.concat(buildTopicWithSection(ele.children, newName));
}
return topics;
}

const test = buildTopicWithSection(data);
console.log(test);

四、输出

[
{
id: 305540,
level: 2,
name: '天天练 知识演练场',
type: 201,
topics: [ [Object], [Object], [Object], [Object] ]
},
{
id: 305541,
level: 2,
module: 13,
name: '天天练 智慧加油站',
type: 201,
topics: [ [Object] ]
},
{
id: 305542,
level: 1,
name: '随堂测',
type: 201,
topics: [ [Object], [Object], [Object], [Object] ]
}
]