使用递归函数从父节点

时间:2015-10-28 14:40:39

标签: javascript algorithm recursion javascript-objects

我有如下数据结构:

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);    

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

假设您的数据结构如下所示

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

循环函数,递归遍历" parent"通过分配" parent"密钥在obj中的值,当密钥" parent"不可用......

    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));

答案 2 :(得分:0)

我认为你不需要递归。

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