var getTreeModel = function(_list, _rootId, setting) {
setting = $.extend({
id : "folderSeq",
parentId : "parentId",
order : [ setting.id, "desc" ]
}, setting);
//최종적인 트리 데이터
var _treeModel = [];
//전체 데이터 길이
var _listLength = _list.length;
//트리 크기
var _treeLength = 0;
//반복 횟수
var _loopLength = 0;
//재귀 호출
function getParentNode(_children, item) {
//전체 리스트를 탐색
for (var i = 0, child; child = _children[i]; i++) {
//부모를 찾았으면,
if (child[setting.id] === item[setting.parentId]) {
var view = {};
for (keyArr in item) {
view[keyArr] = item[keyArr];
}
view["children"] = [];
//현재 요소를 추가하고
child.children.push(view);
//트리 크기를 반영하고,
_treeLength++;
//데이터상에서는 삭제
_list.splice(_list.indexOf(item), 1);
//현재 트리 계층을 정렬
child.children
.sort(function(a, b) {
return a[setting.order[0]] < b[setting.order[0]] ? -1
: a[setting.order[0]] > b[setting.order[0]] ? (setting.order[1]
.toLowerCase() == "desc" ? 1 : 0)
: (setting.order[1].toLowerCase() == "asc" ? 1
: 0);
});
break;
}
//부모가 아니면,
else {
if (child.children.length) {
arguments.callee(child.children, item);
}
}
}
}
//트리 변환 여부 + 무한 루프 방지
while (_treeLength != _listLength && _listLength != _loopLength++) {
//전체 리스트를 탐색
for (var i = 0, item; item = _list[i]; i++) {
//최상위 객체면,
if (item[setting.parentId] === _rootId) {
var view = {};
for (keyArr in item) {
view[keyArr] = item[keyArr];
}
view["children"] = [];
//현재 요소를 추가하고,
_treeModel.push(view);
//트리 크기를 반영하고,
_treeLength++;
//데이터상에서는 삭제
_list.splice(i, 1);
//현재 트리 계층을 정렬
_treeModel
.sort(function(a, b) {
return a[setting.order[0]] < b[setting.order[0]] ? -1
: a[setting.order[0]] > b[setting.order[0]] ? (setting.order[1]
.toLowerCase() === "desc" ? 1 : 0)
: (setting.order[1].toLowerCase() === "asc" ? 1
: 0);
});
break;
}
//하위 객체면,
else {
getParentNode(_treeModel, item);
}
}
}
return _treeModel;
};
//트리 변환 메서드
var getSimpleTreeModel = function (arrayList, rootId) {
var rootNodes = [];
var traverse = function (nodes, item, index) {
if (nodes instanceof Array) {
return nodes.some(function (node) {
if (node.folderSeq === item.parentId) {
node.children = node.children || [];
return node.children.push(arrayList.splice(index, 1)[0]);
}
return traverse(node.children, item, index);
});
}
};
while (arrayList.length > 0) {
arrayList.some(function (item, index) {
if (item.parentId === rootId) {
return rootNodes.push(arrayList.splice(index, 1)[0]);
}
return traverse(rootNodes, item, index);
});
}
return rootNodes;
};
댓글 없음:
댓글 쓰기