1

我有一个简化为以下的数据集

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() 中限定计数器的范围,以允许它返回一个值并通过传入不同的对象或嵌套在我的主结构中的对象来使其可重用。

有任何想法吗?谢谢

4

2 回答 2

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));
于 2013-08-14T11:33:17.787 回答
2

一些代码高尔夫:

function Total(obj) {
      return obj.children 
      ? obj.children.map(Total).reduce(function (prev, cur) { return prev + cur; }) 
      : 1;
}
于 2013-08-14T11:43:24.130 回答