【问题标题】:Tree Recursion: How to get the parent root of the selected tree node树递归:如何获取所选树节点的父根
【发布时间】:2015-03-25 12:11:12
【问题描述】:

我有一个 json 对象的树状结构

{
  "saxena": {
    "chewning": {
      "betten": {},
      "ching": {},
      "kelley": {}
    },
    "kobrinsky": {
      "karniely": {},
      "naveh": {},
      "rozenfeld": {},
      "shalom": {}
    },
    "schriever": {
      "brinker": {},
      "mcleland": {},
      "merrick": {}
    },
    "vacant": {
      "akers": {},
      "carlton": {
        "marvin": {}
      },
      "fox": {
        "glover": {
          "clements": {},
          "koya": {}
        },
        "holden": {}
      }
    }
  },
  "bill": {
    "phil": {
      "bob": {},
      "smith": {},
      "hello": {}
    },
    "bye": {
      "ok": {},
      "hmm": {},
      "no": {},
      "alright": {}
    }
  }
}

根名称是 saxena 和 bill。我想创建一个可以确定用户搜索的根名称的函数。

对于最简单的情况,如果他们搜索 saxena,它会返回 saxena。如果他们退回账单,它会退回账单。

对于更复杂的情况,如果用户搜索她下的任何名称,则将返回 saxena。

例如,如果我搜索 betten、akers、glovers 或 koya,将返回 saxena。

如果我搜索 bob、smith 或 alright,bill 将被退回。

这是我迄今为止的工作。我尝试使用递归,但由于某种原因,当我找到所选名称时,我返回一个未定义的。

var findRootName = function(data, ltmName) {
    for (var key in data) {
        if (key == ltmName) {
            return key;
        } else {
            findNode(data[key], ltmName);
        }
    }
}

var findNode = function(data, ltmName) {
    for (var key in data) {
        if (key == ltmName) {
            return key;
        } else {
            findNode(data[key], ltmName);
        }
    }
}

http://jsfiddle.net/gthnfta7/7/

有人可以帮我弄清楚为什么我的递归函数不起作用吗?

【问题讨论】:

  • 请将您问题的 javascript 直接插入到您的问题中。 StackOverflow 不允许将外部引用作为对您的代码的唯一引用,因为它们有随时间消失或变化的习惯,这会使问题对未来的读者毫无用处,而 Stackoverflow 希望成为重要的信息参考,而不仅仅是最初提出问题的人,但也适用于后来的许多人。
  • 这次你应该这样做,否则你的问题可能会被关闭。使用“编辑”链接修改您的问题并将相关代码插入问题中。
  • 好多了。现在您的问题具有更持久的用处。

标签: javascript json recursion dictionary tree


【解决方案1】:

如果您需要对同一数据进行多次调用,另一种技术如下所示:

function makeSearcher(data) {
    var paths = (function makePaths(data, parentPath, store) {
        var path = parentPath || [];
        results = store || {};
        Object.keys(data).forEach(function(key) {
            var newPaths = path.concat(key);
            results[key] = newPaths;
            makePaths(data[key], newPaths, results);
        });
        return results;
    })(data);
    return function(key) {
        var path = paths[key];
        return path && path[0];
    };
}

var search = makeSearcher(data);

search('clements'); //=> 'savena'

请注意,内部makePaths 函数比这里的使用范围更广,因为它也可以用于返回类似的结果

[ "saxena", "vacant", "fox", "glover", "clements" ]

【讨论】:

    【解决方案2】:

    问题在于,如果找到节点,您不会返回任何内容。你可以这样写来简化你的函数:

    var findParent = function(data, childName) {
      for (var key in data) {
          if (key === childName || findParent(data[key], childName)) {
            return key;
          }
      }
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-06
      • 1970-01-01
      相关资源
      最近更新 更多