如何遍历节点树并修改结构与值?JSON树形结构转换实现
树形JSON结构转换解决方案
问题背景
输入的原始JSON树形数据(包含downlines子节点):
data = [ { "user_id": "1", "username": "johndoe001", "amount": "0.00", "downlines": [ { "user_id": "2", "username": "j001-01", "amount": "1.00", "downlines": [] } ] } ]
需要转换为目标结构:
[ { "key": "1", "label": "johndoe001 (0.00)", "nodes": [ { "key": "2", "label": "j001-01 (1.00)", "nodes": [] } ] } ]
用户尝试用字符串替换完成部分转换,但无法实现label字段合并username与amount,也无法删除多余的amount字段:
let stringJson = JSON.stringify(data); stringJson = stringJson.replace(/downlines/g, 'nodes'); stringJson = stringJson.replace(/username/g, 'label'); stringJson = stringJson.replace(/user_id/g, 'key'); let tmpTree = JSON.parse(stringJson);
解决方法
由于是嵌套树形结构,需要递归遍历每个节点来完成字段的转换、合并与清理,具体代码如下:
function transformTree(data) { // 处理数组中的每个节点 return data.map(node => { const transformedNode = { key: node.user_id, label: `${node.username} (${node.amount})`, // 递归处理子节点 nodes: transformTree(node.downlines || []) }; return transformedNode; }); } // 使用示例 const transformedData = transformTree(data); console.log(JSON.stringify(transformedData, null, 2));
代码说明
- 递归遍历:针对多层嵌套的树形结构,通过递归调用
transformTree处理每个节点的downlines子数组,确保所有层级都被转换。 - 字段合并:直接将
username和amount拼接成label字段的内容,完全匹配需求格式。 - 自动清理:新创建的对象仅保留需要的
key、label、nodes字段,原始的冗余字段不会被包含,自然完成了多余字段的删除。
内容的提问来源于stack exchange,提问作者exiang
相关产品推荐
相关产品推荐

