treeTable 插件有很多,但 jQuery treeTable 应该算是比较简单的,易用,简洁的一个。功能不强,但是很好扩展。而且当作一个简单的 tree 进行使用。
需要注意的是你的 table 需要按照一定的顺序进行排列:儿子必须尾随跟着父亲。
例如:
树形结构如下:
{ "c" : "data-c", "b": { "a": "data-a" } }
html 结构中 a 必须尾随 b,不能位于 c 前或 c 后:
<table>
<tr id="c"><td>data-c</td></tr>
<tr id="b"><td>tree-b</td></tr>
<tr id="a" class="child-of-b"><td>data-a</td></tr>
</table>
为了减少数据之间的转换,采用 array 进行数据存储(与底层数据库存储一致)。
[{"id": "a", "parent": "c", "data": "data-a"}, {"id": "b", "data": "tree-b"}, {"id": "c", "data": "data-c"}]
这样一来,势必就必须对 array 进行重新排序。唉,可惜以前读大学的时候没有好好写代码,不知道这样对不对?
即使侥幸对了,肯定有优化的办法,o(︶︿︶)o 唉,自己的算法好弱,连初高中,大学学的各种玄,各种分,各种函数,都记不清了。枉费我当初的天份啊。苍天哪。
var sortAll = function (ids) { for (var k = 0; k < ids.length; k++) { var id = ids[k]; var order = 0; var objsId = [], // 存放当前节点儿子的 id childList = []; // 存放当前节点儿子的数据 for (var i = 0; i < treeTableData.length; i++) { if (treeTableData[i].id === id) { order = i; }if (reeTableData[i].parent === id) { // 如果为其儿子,存进去吧 objsId.push(treeTableData[i].id); // 把儿子删除后存于 childList childList.push(treeTableData.splice(i, 1)[0]); i--; } } for (var n = 0; n < childList.length; n++) { // 按照你自己想要的顺序重写排列 childList.splice(0, 0, childList.splice(n, 1)[0]); } for (var m = 0; m < childList.length; m++) { // 把儿子放到他爸爸下面吧 treeTableData.splice(order + 1, 0, childList[m]); } if (objsId.length > 0) { // 继续到你没有儿子为止 sortAll(objsId); } } };
var getRoot = function () {
var order = 0,
objsId = [];
for (var i = 0; i < treeTableData.length; i++) {
if (!treeTableData[i].parent) {
// 获取顶层节点
objsId.push(treeTableData[i].id);if (order !== i) { // 顶层节点顺序位于子节点后,进行排序 order++; var obj = treeTableData.splice(i, 1)[0]; treeTableData.splice(order, 0, obj); } } } return objsId; }
sortAll(getRoot());
help me, help you. ^^