如何遍历对象的嵌套子级并收集名称数组

时间:2017-03-17 20:36:41

标签: javascript oop currying

对象中有n个父级和子级

var obj={
    name:'one',
    child:{
        name:'two',
        child:{
            name:'three',
            child..
        }
    }
} 

foo(obj)                        

编写一个函数以获得['one', 'two, 'three', ...]

的输出

10 个答案:

答案 0 :(得分:1)

你应该使用递归函数

var result = [];

function searchChildren(parent){
    if(parent.child){
        result.push(parent.name);
        searchChildren(parent.child);
    }
}

searchChildren(obj);

https://jsfiddle.net/zrbfm9ud/

答案 1 :(得分:1)

这是一种方法,基本上你返回并再次调用函数。有点像一个循环。

var obj={
    name:'one',
    child:{
        name:'two',
        child:{
            name:'three'
        }
    }
} 


function foo(obj, arr) {
  if (!obj) return arr;
  arr.push(obj.name);
  return foo(obj.child, arr);
}

var results = foo(obj,[]);

答案 2 :(得分:1)

使用while循环遍历对象的每个级别,直到找不到object.child



function foo(object) {
  var result = []
  while (object) {
    result.push(object.name)
    object = object.child
  }
  return result
}

var object = {
  name: 'one',
  child: {
    name: 'two',
    child: {
      name: 'three'
    }
  }
}

console.log(foo(object)) //=> ['one', 'two', 'three']




答案 3 :(得分:1)

您可以使用生成器并为对象和数字添加咖喱。

function setObject(object) {
    return function* (n) {
        while (n--) {
            yield object.name;
            object = object.child;
        }
    }
}

var obj = { name: 'one', child: { name: 'two', child: { name: 'three', child: { name: 'four', child: { name: 'five' } } } } },
    getNumbers = setObject(obj);

console.log([...getNumbers(4)]);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 4 :(得分:1)

@ stackoverfloweth的回答对我来说似乎是最好的,因为它非常简单有效。但我认为它可以更简单,而且我还包括最后一级:

var obj={
    name:'one',
    child:{
        name:'two',
        child:{
            name:'three'
        }
    }
} 

var res = [];
function search(obj){
    res.push(obj.name);
    !obj.child || search(obj.child);
}

search(obj);
console.log(res);

答案 5 :(得分:0)

你可以试试这样的事情

funtion f1(array, obj){
  if(obj){
   if(obj.name){
     array.push(obj.name);
   }
   if(obj.child){
     return f1(array, obj.child);
   }
 }
 return array;
}


funtion f2(array, obj){
  while(obj){
    if(obj.name){
      array.push(obj.name);
    }
    obj = obj.child;

   }

   return array;
}

function foo(obj){
 var array = [];
 //recursive version
 return f1(array, obj); 
 // non recursive version
 //return f2(array, obj);
}

foo(obj);

答案 6 :(得分:0)

使用以下递归函数{% for tst in studentexamitems %} {% if qt == tst.qitem_id and st == tst.student_id %} {{tst.qscore}} {% else %} <a href="{% url 'newTableEntry' qt.id st.id %}"> <button type="button" class="btn btn-success btn-xs"> <span class="glyphicon glyphicon-plus"></span>&nbsp; Grade </button> </a> {% endif %} {% endfor %}

getAllNames()

答案 7 :(得分:0)

许多答案检查未定义的子节点作为终止递归的函数的参数。这意味着可以避免额外的呼叫

function doit (obj, arr = []){
    arr.push(obj.name);
    return obj.child ? doit(obj.child, arr) : arr;
}

答案 8 :(得分:0)

此代码将输出这样的数组 ["one", "two", "three"]

&#13;
&#13;
var obj = {
  name: 'one',
  child: {
    name: 'two',
    child: {
      name: 'three'
    }
  }
}

var str = parser(obj);
var arr = str.substring(0, str.length - 1).split(";");

console.log(arr); // Output ["one", "two", "three"]

function parser(obj) {
  var text = obj.name + ";";
  if (obj.child) text += parser(obj.child);
  return text;
}
&#13;
&#13;
&#13;

答案 9 :(得分:0)

试试这个

var string = foo(obj);
var array = str.substring(0, str.length - 1).split(",");

console.log(array);

function foo(obj) {
  var total= obj.name + ",";
  if (obj.child !=null) total= total+ foo(obj.child);
  return total;
}