树递归:如何获取所选树节点的父根

Tree Recursion: How to get the parent root of the selected tree node

本文关键字:树节点 获取 递归 何获取      更新时间:2023-09-26

我有一个 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,它会返回 saxena。如果他们返回账单,则返回账单。

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

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

如果我搜索鲍勃,史密斯或好吧,账单将被退回。

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

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/

有人可以帮助我并找出为什么我的递归函数不起作用吗?

问题是在

找到节点时不会返回任何内容。你可以通过这样编写来简化你的函数:

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

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

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" ]