如何使用 JavaScript 和 JSON 查找组的所有叶子

how to find all leaves of group with javascript and json

本文关键字:叶子 查找 何使用 JavaScript JSON      更新时间:2023-09-26

我想列出组名为"group110"的所有叶子ID,即"group110"因此,此示例的输出为 014、288、223 和 244。

这是我的JSON文件的内容:

{
 "name": "visualization",
 "children": [
        {
         "name": "group100",
         "children": [
                {
                 "name": "group110",
                 "children": [
                        {
                         "name": "group111",
                         "children": [
                                        {"id":"014","link":"-","name":" Animals/70","decade":"-"}
                                ]
                        },
                        {
                         "name": "group112",
                         "children": [
                                        {"id":"288","link":"-","name":"Heidelberg platen press","decade":"1960s"}
                                ]
                        },
                        {
                         "name": "group113",
                         "children": [
                                        {"id":"223","link":"-","name":"Camera Praktica Super TL – shutter release","decade":"1960s"},
                                        {"id":"244","link":"-","name":"Mechanical calculator, Facit","decade":"1950s"}
                                ]
                        }
                        ]
                },

试试这个方式。使用递归方法查找组,并使用另一种递归方法收集叶节点。

function getLeafNodes(leafNodes, obj){
    if(obj.children){
        obj.children.forEach(function(child){getLeafNodes(leafNodes,child)});
    } else{
        leafNodes.push(obj);
    }
}
function findIds(json,name){ 
   if(json.children){       
        if(json.name==name)  {
           var leafNodes = [];   
           getLeafNodes(leafNodes,json);
           console.log(leafNodes.map(function(leafNode){ return leafNode.id; })); //Logs leaf node ids to the console
        } else {
           json.children.forEach(function(child){                               
              findIds(child,name);
           });      
        }   
   }
}

执行以下代码将打印["014", "288", "223", "244"]

findIds(actualJSON,"group110");

以下代码以递归方式遍历树。如果paramchildren,那么它的children将被遍历。否则,其id将附加到results数组中,因此,最后results将包含叶子的idgetResults返回results以简化其使用。

var results = [];
function getResults(param) {
    if (!!param.children) {
        for (var child in param.children) {
            getResults(param.children[child]);
        }
    } else {
        results[results.length] = param.id;
    }
    return results;
}

这是一个通用的简短递归答案,用于使用一些jquery($.map)查找节点。不过,如果数据很深,请注意堆栈溢出!此外,它不会继续在匹配节点内搜索更多匹配的子节点,因此仅当搜索词未在逻辑上嵌套时才适用。此方法利用了 $.map 的数组平展功能。

var found = (function walk(obj, searchKey, searchTerm) {
   if(!$.isPlainObject(obj)) return null; 
   return obj[searchKey] === searchTerm ? [obj] : $.map(obj, function (lev) { 
       return walk(lev, searchKey, searchTerm); 
   }); 
})(data, 'name', 'group110');

在此基础上扩展以解决上述特定问题...

var found = (function walk(obj, searchTerm) { 
   if(!$.isPlainObject(obj)) return null;
   return obj.name == searchTerm 
            ? $.map(obj.children, function(c){ 
                  return $.map(c.children, function(f){ return f.id; }); })
            : $.map(obj.children, function (lev) { 
                  return walk(lev, searchTerm); }); 
})(data, 'group110');

或者更确切地说

var found = (function walk(obj, lambda, term) { 
   if(!($.isPlainObject(obj) || $.isArray(obj))) return null;
   return lambda.call(obj, term) 
            ? $.map(obj.children, function(c){ 
                  return $.map(c.children, function(f){ return f.id; }); })
            : $.map(obj.children, function (lev) { 
                  return walk(lev, searchTerm); }); 
})(data, function(a){ return this.name == a; }, 'group110');