【问题标题】:Using recursive function to get data from parent nodes使用递归函数从父节点获取数据
【发布时间】:2016-01-28 09:42:55
【问题描述】:

我的数据结构如下:

obj
 name
 parent
   name
   parent
     name
     parent

我正在尝试执行递归函数来获取 name 元素,只要有父元素。我想出了以下代码,但它不起作用,因为它将结果转换为字符串(而不是对象)。有人可以就如何最好地实现这一目标给我一些建议。父元素的嵌套是多种多样的,不是固定的(尽管上面我只指定了 3 层)。范围从 1 到 100。

我想要的结果

我的最终目标是从层次结构中的每个“父级”中提取所有“名称”元素(并将它们推送到一个数组中)。

function getElem(obj){
    var result = '';
    var parent = '.parent';
    var temp = '';

    if(!obj.parent){
        return obj.name
    }
    else {
        //structure is obj.parent.parent.parent...name
        temp += parent;
        result = obj + temp + '.name';
        console.log(result);
        getElem(result);
    }
}
getElem(e.data);    

【问题讨论】:

  • 那么看这个,我相信如果你想返回父对象,你将不得不返回该对象及其所有子对象。但显然它正在返回一个字符串,因为您正在返回 obj.name 这是一个字符串

标签: javascript algorithm recursion javascript-objects


【解决方案1】:
function getElem(obj, arr) {
  arr = arr || [];
  if (obj.name) {
      arr.push(obj.name);
  }

  if (obj.parent) {
      return (getElem(obj.parent, arr));
  }
  else {
      return (arr);
  }
}

JSFiddle

【讨论】:

    【解决方案2】:

    假设你的数据结构是这样的

        var obj = {
            name: 'abc',
            parent: {
                name: 'def',
                parent: {
                    name: 'ghi',
                    parent: {
                        name: 'jkl'
                    }
                }
            }
        };
    

    函数循环遍历“父”键,通过在 obj 中分配“父”键的值并在“父”键不可用时中断循环...

        function get_names(obj, key) {
            var names = [];
            if(key == "undefined") {
                key = "parent"; // default value of key
            }
            do {
    
                if(typeof obj === "undefined") {
                    break; // breaks the loop when obj/parent is undefined
                }
                names.push(obj.name); // pushes all the elements named as 'name'
    
            } while(obj = obj.parent);
    
            return names;
        }
    

    在控制台中记录数组

        console.log(get_names(obj));
    

    【讨论】:

    • 如果能解释一下这段代码为什么能解决问题就更好了。
    • @JorgeHortelano 这只是一个循环,在附加了 cmets 的对象上递归遍历。
    • 虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。如果有人需要寻找更适合的答案,必须阅读并完全理解您的代码。
    • @JorgeHortelano 我再次编辑了帖子,请检查并告诉它是否可以。非常感谢
    【解决方案3】:

    我认为你不需要递归。

    function getElem(obj) {
        var names = [obj.name];
        while (obj.parent) {
            obj = obj.parent;
            names.push(obj.name);
        }
        return names;
    }
    

    【讨论】:

    • 这没关系,但如果最终目标是提取所有名称,则应在开头声明一个空数组并在每次迭代时推送节点名称。
    • @pQuestions123:不完全是。我想要的只是从层次结构中的每个父级中提取所有名称元素
    • @user1142130 修改为返回数组
    猜你喜欢
    • 2015-10-14
    • 2021-09-08
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    • 1970-01-01
    • 1970-01-01
    • 2016-08-17
    • 1970-01-01
    相关资源
    最近更新 更多