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. (pre)源数据(对象列表)满足一个条件:儿子不能在其父之前出现
  2. 使它成为关联数组(key=id,value=object),所以它必须是字符串键控的。
  3. 弹出最后一个数组元素并将其推入其父元素的子数组中。对所有非空父元素重复此操作。
  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 回答