0

以下の「ルート」オブジェクトなどのネストされたオブジェクトを使用します。配列の長さが 2 未満の配列に「ダミー」オブジェクトを追加するにはどうすればよいですか。

var root = {
  children: [
    {
      children: [
        {value: 42}
      ]
    },
    {
      children: [
        {value: 42},
        {value: 42}
      ]
    },
    {value: 42}
  ]
};

配列に挿入したいオブジェクトの例array.length < 2:

var dummy = {value: 10, dummy: 1};

結果の配列:

var rootWithDummies = {
  children: [
    {
      children: [
        {value: 42},
        {value: 10, dummy: 1}
      ]
    },
    {
      children: [
        {value: 42},
        {value: 42}
      ]
    },
    {value: 42}
  ]
};

まだ学ぶべきことがたくさんありますが、再帰を使用しようとしています: 元の addDummies 関数を編集して、いつすべきかをチェックしnest.valuesいましたnest.children CORRECTED FUNCTION

function addDummies (nest, dummyObject) {

    if (nest.hasOwnProperty("children")) {

        if (nest.children.length < 2) {
            nest.children.push(dummyObject)
        }

        nest.children.forEach(function (item) {

            addDummies(item);

        ;})
    }
}

古い間違った関数 function addDummies (ネスト、ダミーオブジェクト) {

    if (nest.hasOwnProperty("values")) {

        if (nest.values.length < 2) {
            nest.values.push(dummyObject)
        }

        nest.values.forEach(function (item) {

            addDummies(nest.values);

        ;})
    }
}

この試みは、addDummies を再帰的に呼び出しているようには見えず、'values' の値が実際に配列である (したがって、長さのプロパティを持っている) ことを確認していません。

4

2 に答える 2

0

あなたは近くにいました。変更点:

  • ;})最後から3行目の構文エラーを削除します
  • whileダミーオブジェクトを1つだけ追加する代わりに、ループを使用します

http://jsfiddle.net/jbabey/V3bvV/

var padNode = function padNode (node) {
    if (node.children) {
        while (node.children.length < 2) {
            node.children.push(dummy);
        }  

        for (var i = 0; i < node.children.length; i++) {
            padNode(node.children[i]);
        }        
    }
};
于 2012-09-10T13:02:32.840 に答える
0

ここに実用的な解決策があります:

var root = {
  children: [
    {
      children: [
        {value: 42}
      ]
    },
    {
      children: [
        {value: 42},
        {value: 42}
      ]
    },
    {value: 42}
  ]
};
var dummy = {value: 10, dummy: 1};

function addDummies (node) {

    if (node.children) {
      if (node.children.length < 2) {
        node.children.push(dummy)
      }  
      for (var i=0, len=node.children.length; i<len; i++) {
        addDummies(node.children[i]);
      }
    }
}

addDummies(root);
console.log(root);

そしてjsフィドル: http: //jsfiddle.net/kKrFC/

1時間ほどでうまくいかなかった理由を説明して編集します。今すぐ行かなければなりません。

編集

オブジェクトのhasOwnPropertyメンバーをループしているときにのみチェックする必要があるため、チェックは必要ありません。の各要素はルートノードのようなものであるため、実行する必要があるのは、関数パラメータchildrenとしての各要素を送信することです。それはまさに再帰の考え方です(少なくともこの場合)。

于 2012-09-10T12:51:09.217 に答える