Sunny-117 / js-challenges

✨✨✨ Challenge your JavaScript programming limits step by step

Home Page:https://juejin.cn/column/7244788137410560055

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

查找json中的children路径

Sunny-117 opened this issue · comments

现有如下json(简化为对象),已知每个节点id唯一,编写findNode(id),返回路径,如findNode(5 输出 1->4->5

json = {
    id: 1,
    children: [
        { id: 2, children: [{ id: 3, children: [] }] },
        {
            id: 4,
            children: [
                { id: 5, children: [] },
                { id: 6, children: [] },
            ],
        },
        { id: 7, children: [] },
    ],
};
function findNode(obj) {
    const res = []
    function dfs(obj, currPath, target) {
        if (!obj) return;
        if (obj.id === target) {
            currPath += obj.id
            res.push(currPath)
            return
        }
        currPath += obj.id + '->'
        obj.children && obj.children.forEach(ele => {
            dfs(ele, currPath, target)
        });
    }
    dfs(obj, '', 5)
    return res;
}
commented
const json = {
    id: 1,
    children: [
        { id: 2, children: [{ id: 3, children: [] }] },
        {
            id: 4,
            children: [
                { id: 5, children: [] },
                { id: 6, children: [] },
            ],
        },
        { id: 7, children: [] },
    ],
};
console.log(findNode(json, 5)); // 1->4->5

/**
 * 每个节点id唯一,输出路径
 * @param {*} json 
 * @param {*} target 
 */
function findNode(json, target) {
    function dfs(node, target, arr) {
        if(!node) return;
        arr.push(node.id);
        if(node.id === target && !bool) {
            res.push(...arr);
            bool = true;
            return;
        }
        try {
            node.children && node.children.forEach(child => {
                if(bool) throw new Error("IS FOUND");
                dfs(child, target, arr);
                arr.pop();
            })
        } catch(e) {
            return;
        }
    }
    const res = [];
    let bool = false;
    dfs(json, target, []);
    return res.join('->');
}
function findNode(id, node = json) {
  if (node.id === id) {
    return node.id.toString();
  }
  if (node.children.length === 0) {
    return null;
  }
  for (let i = 0; i < node.children.length; i++) {
    const result = findNode(id, node.children[i]);
    if (result !== null) {
      return node.id.toString() + "->" + result;
    }
  }
  return null;
}
function findNode(tree, targetId) {
  let path = [],
      res = []

  traversal(tree)
  return res.join('->')

  function traversal(node) {  // The parameter 'node' is an object
    if (!node) return

    path.push(node.id)
    if (node.id === targetId) {
      res.push(...path)
      path.pop()
      return
    }
    node.children && node.children.forEach(item => {
      traversal(item)
    })
    path.pop()
  }
}

console.log(findNode(tree, 5)) // 1->4->5
function findNode(obj) {
    const track = [];
    let res = [];
    function dfs(obj, target) {
        if(!obj) {
            return;
        }
        if(obj.id === target) {
            track.push(obj.id);
            res = [...track];
            return;
        }
        track.push(obj.id);
        obj.children.forEach(item => {
            dfs(item, target);
        })
        track.pop();
    }
    dfs(obj, 5)
    return res;
}