JavaScript - 递归函数中的错误是什么?

qwa*_*g07 1 javascript

我尝试获取查询ID的整个路径.例如,getPath(6,rawData)应返回[1,2,6].但是,它返回[6,6,6].当我在代码中尝试console.log时,看起来自调用函数内的节点的值将覆盖外部节点的值.我无法弄清楚递归函数有什么问题.或者有人可以教我一种实现同一目标的新方法?

这是代码:

const getPath = (id, list) => {
  if (!list || !Array.isArray(list)) {
    return false
  }

  for (node of list) {
    if (node.id === id) {
      return [node.id]
    }

    let res = getPath(id, node.children)

    if (res) {
      return [node.id, ...res]
    }
  }

  return false
}

const rawData = [{
    id: 1,
    parent: null,
    children: [{
      id: 2,
      parent: 1,
      children: [{
        id: 4,
        parent: 2,
        children: null
      }, {
        id: 5,
        parent: 2,
        children: null
      }, {
        id: 6,
        parent: 2,
        children: null
      }]
    }]
  },
  {
    id: 3,
    parent: null,
    children: [{
        id: 7,
        parent: 3,
        children: [{
          id: 9,
          parent: 7,
        }]
      },
      {
        id: 8,
        parent: 3,
      }
    ]
  }
]

console.log(getPath(2, rawData))
Run Code Online (Sandbox Code Playgroud)

Bar*_*mar 5

您需要声明变量node,使其成为函数的本地变量.

const getPath = (id, list) => {
  if (!list || !Array.isArray(list)) {
    return false
  }

  for (let node of list) {
    if (node.id === id) {
      return [node.id]
    }

    let res = getPath(id, node.children)

    if (res) {
      return [node.id, ...res]
    }
  }

  return false
}

const rawData = [{
    id: 1,
    parent: null,
    children: [{
      id: 2,
      parent: 1,
      children: [{
        id: 4,
        parent: 2,
        children: null
      }, {
        id: 5,
        parent: 2,
        children: null
      }, {
        id: 6,
        parent: 2,
        children: null
      }]
    }]
  },
  {
    id: 3,
    parent: null,
    children: [{
        id: 7,
        parent: 3,
        children: [{
          id: 9,
          parent: 7,
        }]
      },
      {
        id: 8,
        parent: 3,
      }
    ]
  }
]

console.log(getPath(2, rawData))
Run Code Online (Sandbox Code Playgroud)