【问题标题】:JavaScript find recursively by pathJavaScript 按路径递归查找
【发布时间】:2019-03-07 14:18:24
【问题描述】:

我有以下数据结构:

[
  {
    name: 'root',
    children: [
      {
        name: 'page',
        children: [
          // and so on
        ]
      }
    ]
  }
]

我需要一个函数来获取路径给出的最新对象。例如。 getCurrentTree('root.page')应该返回

      {
        name: 'page',
        children: [
          // and so on
        ]
      }

希望你明白我的意思!我知道我应该递归地做,但递归总是让我头疼。另外我不确定是否应该使用findfilter 执行此操作?甚至reduce?有人有聪明的主意吗?

干杯

【问题讨论】:

  • 递归不应该是一个令人头疼的问题。它使这类问题变得更加简单。
  • 最新对您意味着什么?此外,所有这些都放置在数组内。你能有同名的并行对象吗,比如 [ {name: "root"...}, {name: root} ]
  • @epascarello,不,因为你需要找到数组的正确项。

标签: javascript recursion ecmascript-6


【解决方案1】:

您可以检查名称并迭代子项或返回对象。

function getCurrentTree(array, names) {
    var [name, path] = names.split('.', 2),
        result;

    array.some(o => {
        if (o.name === name) {
            return result = path ? getCurrentTree(o.children, path) : o;
        }
    });
    return result
}

var data = [{ name: 'root', children: [{ name: 'page', children: [] }] }];

console.log(getCurrentTree(data, 'root.page'));

【讨论】:

    【解决方案2】:

    类似的东西?

    let mainList = [
      {
        name: 'root',
        children: [
          {
            name: 'page',
            children: [
    
            ]
          }
        ]
      }
    ]
    
    function getCurrentTree(path) {
      const paths = path.split('.')
      return traverse(mainList, paths, 0) 
    }
    
    function traverse(list, paths, level) {
      const node = list.find(obj => obj.name === paths[level])
    
      if (level === paths.length - 1) {
        return node
      } else {
        return traverse(node.children, paths, level + 1)
      }
    }
    
    getCurrentTree("root.page")
    // => {name: "page", children: Array(0)}
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-22
      • 2017-09-24
      • 1970-01-01
      • 2013-03-14
      • 1970-01-01
      • 1970-01-01
      • 2015-03-11
      • 2020-02-14
      相关资源
      最近更新 更多