3

JSON オブジェクトの各ルート ノード P の合計子数を調べるにはどうすればよいですか。これは DOM 構造ではありません。P2 は P1 の子であるため、 P2 の子も P1 の子であると見なします。

P1-|-C1            (P1 children count 3)
   |-C2
   |-P2-|-C1       (P2 children count 5)
        |-C2
        |-P3-|-C1  (P3 children count 2)
             |-C2
        |-C3
        |-C4
        |-P4-|-C1   (P4 children count 2)
             |-C2

前もって感謝します。

4

4 に答える 4

4

ライブラリやカスタム コードがなくても、かなりシンプルです。

//Or whatever way you want to grab a reference to the DOM node
var p1 = document.getElementById('P1');

p1.getElementsByTagName('*').length

多分私は質問を誤解しました。これは、あなたの望むことですか?:

p1.childNodes.length
于 2013-01-16T07:23:07.860 に答える
2

再帰的な深さ優先検索を使用してこれを行う方法は次のとおりです。

function dfs(current, result) {
  var children = current.getChildren(),
      forEach = Array.prototype.forEach;
  result = result || {};
  result[current.id] = result[current.id] || 0;
  forEach.call(children, function (c) {
    result[current.id] += 1;
    dfs(c, result);
  });
  return result;
}
var result = dfs(document.getElementById('p1'));

console.log(result);

スクリプトは純粋な JavaScript を使用します。

サンプル HTML:

<div id="p1">
  <div id="p2">
    <div id="p5"></div>
    <div id="p6"></div>
  </div>
  <div id="p3">
    <div id="p7"></div>
    <div id="p8"></div>
    <div id="p9"></div>
    <div id="p10">
        <div id="p11"></div>
    </div>
  </div>
  <div id="p4"></div>
</div>

result内容:

p1: 3
p2: 2
p3: 4
p4: 0
p5: 0
p6: 0
p7: 0
p8: 0
p9: 0
p10: 1
p11: 0

各要素が必要であることに注意してくださいid。そうしないと、次のような結果が得られます。

undefined: 15
p1: 5
...

これはjsfiddleの例です。

于 2013-01-16T07:23:25.263 に答える
1

ここにちょっとした再帰関数がありますが、私の頭の上にはありません...

function recChildCount(node, level)
{
    level = (level || 0)++;
    var tree = {},
    i = 0;
    tree['level' + level] = {count: node.childNodes.length,
                             children: []};
    if (node.hasChildNodes() === false)
    {//dead end
        return tree;
    }
    for (i; i < node.childNodes.length; i++)
    {
        tree['level' + level].children.push(recChildCount(node.childNodes[i],level));
    }
    return tree;
}

これは、次の行に沿ってオブジェクトを返す必要があります。

{level1: {count: 123,
          level2: { count: 12,
                    children: [level3: { count: 16,
                                        children:[{level4:{count: 0,
                                                          children:[]},
                                                  {level4: {count: 0,
                                                            children:[]}]
                                        }
                               ]
                   }
           }
 }

delete tree.children;もちろん、子供がいないときに a を追加することもできます。
繰り返しますが、これは私の頭の中にあるので、このコードには微調整が必​​要かもしれませんが、それがあなたの助けになることを願っています

于 2013-01-16T08:21:51.077 に答える
-1

jqueryプラグインを使用

.length次のように、子孫セレクターだけで使用できます。

を使用する必要がある場合は.children()、次のようになります。

var count = $("#yourId").children().length;

最初のレベルのみが必要なので、使用します

$('#yourId > *').children().length;
于 2013-01-16T07:20:12.043 に答える