4

オブジェクトのリストをjstreeで食べられるjson形式に「変換」したいと思います。

data = [
    { 
        "data" : { 
            "title" : "father",
            "attr" : { "href" : "#" }
        },
        "children" : [
            { 
                "data" : { 
                    "title" : "Older Son",
                    "attr" : { "href" : "#" }
                },
                "children" : []
            },
            { 
                "data" : { 
                    "title" : "Younger Son",
                    "attr" : { "href" : "#" }
                },
                "children" : []
            }
        ]
    },
]

私の入力は次のようになります。

[
Object
id: 35
name: "bnm,bnm"
parent_id: null
, 
Object
id: 36
name: "ghk"
parent_id: 35
, 
Object
id: 37
name: "hgkgh"
parent_id: null
, 
Object
id: 38
name: "jklhjk"
parent_id: null
, 
Object
id: 39
name: "fghdfgh"
parent_id: 38
, 
Object
id: 40
name: "bsdbd"
parent_id: 38
,
...]

正直なところ、これは木ではなく、森です。しかし、それは問題ではありません。

私はそれにかなりの時間を費やしましたが、それを機能させることができませんでした。配列の操作は、javascript では (Java、C++、または PHP と比較して) 厄介なようです...

私がこれまでに試したことは次のとおりです。

  1. (前) ソース データ (オブジェクトのリスト) が 1 つの条件を満たしている: 息子は親になる前に存在することはできません
  2. 連想配列 (key=id、value=object) にするため、文字列をキーにする必要がありました。
  3. 最後の配列要素をポップし、親要​​素の子配列内にプッシュします。null 以外のすべての親要素に対してこれを繰り返します。
  4. これがうまくいくことを願った。
4

2 に答える 2

7

最初にすべての項目を ID でインデックス付けされたスパース配列に配置し、子 (存在するが空である必要があります) を除き、親 ID を含むすべてを変換します。

var itemsByID = [];
items.forEach(function(item) {
    itemsByID[item.id] = {
        data: {title: item.name},
        children: [],
        parentID: item.parent_id
    };
});

次に、すべての項目を調べて、子を親に追加します。

itemsByID.forEach(function(item) {
    if(item.parentID !== null) {
        itemsByID[item.parentID].children.push(item);
    }
});

次に、根を見つけます。

var roots = itemsByID.filter(function(item) { return item.parentID === null; });

次に、親 ID を削除してアイテムをクリーンアップします。

itemsByID.forEach(function(item) { delete item.parentID; });

ツリーのルートは になりますroots


あなたのメソッドが機能しなかった理由は、より大きな ID 番号を持つ親を持つ子がいる場合、親要素が存在しないためです。すでに処理してポップしています。完了するまで、すべてのアイテムを配列に残す必要があります。

于 2013-03-30T01:31:05.850 に答える
1

たぶん、 unsplayはトリックを行いますか?

>> var unsplay = require('unsplay');
>> unsplay([{id: 0}, {id: 1, pid: 0}], 'id', 'pid');
[{
  item: {id: 0},
  children: [{
    item: {id: 1, pid: 0},
    children: []
  }]
}]

(免責事項:私は著者です)

于 2015-07-09T04:51:53.013 に答える