2013-12-12 25 views
6

私は、各アイテムに親アイテムへの参照が含まれるような構造のようなツリーを生成する関数を作成しようとしています。Javascript再帰関数リファレンスthis

子を作成するときにそれ自身を呼び出す機能がありますが、それを実行するのに苦労しています。thisは、現在のものではなくトップレベルの項目を参照しています。

アイテムのコンソールへのロギング最初のレベルよりも深いとき、親は常にチェーン内の最初のアイテムを参照する(または存在しない)ことがわかります。ツリーを作成しますが、親への参照は最初の項目以外の項目では失われます。

var root = JSON.parse('{"id":"1","name":"root item","root":"1","lft":"1","rgt":"22","level":"1","type": 
"category","parent_id":"1","deadline":null, 
"children":[ 
{"id":"2","name":"item 1","root":"1","lft":"14","rgt":"15","level":"2","type":"category","parent_id":"1"}, 
{"id":"6","name":"item 2","root":"1","lft":"16","rgt":"19","level":"2","type":"category","parent_id":"1"}, 
{"id":"10","name":"item 3","root":"1","lft":"20","rgt":"21","level":"2","type":"item","parent_id":"1"}]}'); 
+0

ちょうどタイプミス、私は実験していたと投稿する前にそれを変更することを忘れてしまった。ここでも問題は解決しています。 – JPR

+1

いくつかのダミーデータを使ってこれを作成することができますか? –

+0

確かに、それを一緒にするには数分かかるかもしれません。ありがとう。 – JPR

答えて

1

問題は_.without methodの使用状況です。除外する要素は、配列ではなく可変数の引数として渡されます。

間違った用法:['a', 'b']

_.without(['a','b'],['a']) 

結果(あなたが望んでいないものを)

一方:

_.without(['a','b'],'a') 

は、あなたの期待される結果が得られます。['b']

はここでupdated fiddleです修正。

注:循環参照を避けるため、「結果」出力にparentの代わりにparent.idを出力します。

1

それは私のために仕事をしていません:トラブル行くフィドルを得るためのビットを持つことが、ここではいくつかのサンプルデータである

var Item = function (item, parent) { 
    console.log('item is :' + item.name); 
    this.parent = parent; 
    console.log('parent is: ' + parent); 
    var fields = _.union(_.keys(item), _.keys(this.parent)); 
    _.each(_.without(fields, ['parent','children']), function (prop) { 
    this[prop] = angular.isDefined(item[prop]) ? item[prop] : this.parent[prop]; 
    }, this); 

    this.children = []; 
    if (item.children) { 
    this.children = _.map(item.children, function (child) { 
     console.log('this is : ' + this); 
     return new Item(child, this) 
    }, this); 
    } 
}; 

var tree = new Item(root, {}); 

。私は少しコードを簡素化し、孫の項目を追加しました。見てください: http://jsfiddle.net/7QYQL/1/

var grandchild = {}; 
grandchild.name = 'grandchild'; 
var child = {}; 
child.name = 'child'; 
child.children = []; 
child.children[0] = grandchild; 
var root = {}; 
root.name = 'root'; 
root.children = []; 
root.children[0] = child; 

問題は2番目のパラメータとして配列ではなく、リストを取り_.without()でした。

_.without(fields, 'parent','children') 

この1つは動作します: http://jsfiddle.net/eRbhm/13/

+0

ありがとう、それに大きな賛辞。私はあなたの最初の答えを試みたが、それは働いたが、私のコードはまだしなかったし、私はあなたのことが私がやっていたものと根本的に異なる方法を理解できなかった。それを直ちに固定することなく、私はそれを見落としてしまった。 – JPR