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 に答える