1. 程式人生 > >JavaScript之parentId轉換成children數據,並解析

JavaScript之parentId轉換成children數據,並解析

parentId children 廣度優先 深度優先

1.用parentId的數據格式轉換成有children的數據

var array = [];
    var iterator1 = function (treeNodes) {
        if (!treeNodes || !treeNodes.length) return;
		var parent,i = 0,obj = {};
		while(i < treeNodes.length ){
			node = treeNodes[i++];
			obj[node.id] = node;
			if(node.parentId){
				parent = obj[node.parentId];
				if(parent.children){
					node["parIndex"] = parent.parIndex +"."+ (parent.children.length + 1);
					node.cell[0] = node["parIndex"];
					parent.children.push(node);
				}else{
					node["parIndex"] = parent.parIndex +"."+ 1;
					node.cell[0] = node["parIndex"];
					parent.children = [node];
				}
			}else{
				node["parIndex"] = 1;
				array.push(node);
			}
		}
		
        return array;
    };

    console.log('------------- 遞歸 ------------------');
    iterator1(treeNodes);

2.將有children的數據拆成平級對象(非遞歸深度優先)

var array1 = [];
    var iterator2 = function (treeNodes) {
        var stack = [];

        if (!treeNodes || !treeNodes.length) return;

        //先將第一層節點放入棧
        for (var i = 0, len = treeNodes.length; i < len; i++) {
            stack.push(treeNodes[i]);
        }

        var item;

        while (stack.length) {
            item = stack.shift();

            console.log(item.id);
			
            //如果該節點有子節點,繼續添加進入棧頂
            if (item.children && item.children.length) {
                stack = item.children.concat(stack);
            }
			delete item.children;
			delete item.parIndex;
			array1.push(item);
        }
    };

    console.log('------------- 非遞歸深度優先實現 ------------------');
    iterator2(array);

3.非遞歸廣度優先

//非遞歸廣度優先實現
    var iterator1 = function (treeNodes) {
        var stack = [];

        if (!treeNodes || !treeNodes.length) return;

        //先將第一層節點放入棧
        for (var i = 0, len = treeNodes.length; i < len; i++) {
            stack.push(treeNodes[i]);
        }

        var item;

        while (stack.length) {
            item = stack.shift();

            console.log(item.id);

            //如果該節點有子節點,繼續添加進入棧底
            if (item.children && item.children.length) {

                stack = stack.concat(item.children);
            }
        }
    };

    console.log('------------- 非遞歸廣度優先實現 ------------------');
    iterator1(treeNodes);


JavaScript之parentId轉換成children數據,並解析