JSRUN
NodeTraverse 参考下图,输出 id 和 level 的映射 定义 根节点的 深度 是 0,子节点的深度是父节点的 深度 + 1
使用此草稿 删除草稿
const findFirstNode = (nodeList)=>{ const startArr = []; const endArr = []; nodeList.forEach(ite => { let nextItem, preItem; nodeList.some(i => { if (i.id === ite.nextId) { nextItem = i; } else if (i.nextId === ite.id) { preItem = i; } return nextItem && preItem; }); if (!nextItem) endArr.push(ite); if (!preItem) startArr.push(ite); }); if (startArr.length >= 2) return console.error('链表出现了中断'); if (!startArr.length || !endArr.length) return console.error('这可能是一个环表'); return startArr[0].id; } const list = [{"id":3,"nextId":1},{"id":1,"nextId":2},{"id":2,"nextId":3}]; console.log(`结果: ${findFirstNode(list)}`);
发错题了
const measure = (node, index = 0) => { if (Object.prototype.toString.call(node) === '[object Object]') { // 根节点 measure(node.children, 1); function customFlat(arr, res = []) { arr.forEach(ite => { res.push({ id: ite.id, level: ite.level }); if (ite.children) customFlat(ite.children, res) }); return res; } return [{id: node.id, level: 0}, ...customFlat(node.children)]; } else { return node.map(ite => { ite.level = index; if (ite.children) { ite.children = measure(ite.children, index+1) } return ite; }) } } console.log(measure(node))