从javascript对象/数组结构中的任何一点计算'最后一个孩子'

时间:2013-08-14 11:28:16

标签: javascript recursion

我将数据集简化为以下

var data = {
  foo: 'bar'
  children: [
    {
      foo: 'bar'
      children: [ 
        { foo: 'bar' }, // count
        { foo: 'bar' }, // count
        {
          foo: 'bar'
          children: [
            { foo: 'bar' }, // count
            { foo: 'bar' }, // count
          ]
        },
        { foo: 'bar' }, // count
      ]
    },
    {
      // etc
    }
  ]
}

还有更多的东西。嵌套下面的任意数量的对象。

{
  foo: 'bar'
  children: []
}

我希望能够计算结构中任何“节点”的总“最后一个孩子”。到目前为止,我已经编写了一个快速脚本,它将使用在递归函数外部的计数器变量从顶层开始工作 - 但这会阻止它重复使用。

var total = 0;

var countLastChildren = function(object) {

  if(object.children) {
    object.children.forEach(function(el){
      countLastChildren(el);
    }); 
  } else {
    total++;
  }
}
countLastChildren(data);
console.log(total);

我无法理解如何在countLastChildren()内部计数器,以允许它返回一个值,并通过传入嵌套在我的主结构中的不同对象或对象使其可重复使用。

有什么想法吗?感谢

2 个答案:

答案 0 :(得分:4)

你可以让函数返回计数:

var countLastChildren = function(object) {

    if(object.children) {
        var return_val = 0;
        object.children.forEach(function(el){
            return_val += countLastChildren(el);
        });
        return return_val; 
    } else {
        return 1;
    }
}
console.log(countLastChildren(data));

答案 1 :(得分:2)

一些代码打高尔夫球:

function Total(obj) {
      return obj.children 
      ? obj.children.map(Total).reduce(function (prev, cur) { return prev + cur; }) 
      : 1;
}