如何为存在多父级子节点的嵌套JSON对象添加正确depth值?
问题修复:为嵌套数组所有对象正确添加depth属性
你的代码问题出在assignDepth递归函数里的return语句——当处理某个节点的子节点时,return会直接终止当前层级的后续同级节点遍历,导致只有第一个同级节点能被正确赋值depth,其余节点被跳过。
修复后的代码
var data = [ { "title": "meta", "parentids": [] }, { "title": "instagram", "parentids": ["meta"] }, { "title": "facebook", "parentids": ["meta"] }, { "title": "whatsapp", "parentids": ["meta"] }, { "title": "zuckerberg", "parentids": ["instagram", "facebook"] }, ] // Assign a 'children' property to each object. data.forEach(o => o.children = []) // For each object assign a key/object pair let map = data.reduce((a, o) => (a[o.title] = o, a), {}) // For each 'parentids' in each object in data push this object data.forEach(o => o.parentids.forEach(pid => map[pid] && map[pid].children.push(o))) let copyOfData = [...data]; let assignDepth = (arr, depth = 0, index = 0) => { if(index < arr.length){ arr[index].depth = depth; // 去掉return,先处理子节点,不终止当前遍历 if(arr[index].children.length){ assignDepth(arr[index].children, depth+1, 0); }; // 继续处理当前数组的下一个节点 assignDepth(arr, depth, index+1); }; }; if (copyOfData.length) { assignDepth(copyOfData) console.log(copyOfData) }
修复逻辑说明
- 移除处理子节点时的
return,确保处理完当前节点的子节点后,会继续执行后续代码,遍历当前数组的下一个同级节点。 - 递归不再被提前终止,所有节点(包括同级节点、深层子节点)都会被依次赋值正确的depth值。
内容的提问来源于stack exchange,提问作者Jane Delugas
相关产品推荐
相关产品推荐

