要是实在不知道要干什么,那就喝两杯思路就来了!

导航菜单

初探 TypeScript 语言

// 问题综述:有以下组织节点数据,回答下面问题(用 TS 实现)
const orgTreeData = [
    {
        username: "0-0",
        userid: "0-0",
        children: [
            {
                username: "0-0-0",
                userid: "0-0-0",
                children: [
                    { username: "0-0-0-0", userid: "0-0-0-0" },
                    { username: "0-0-0-1", userid: "0-0-0-1" },
                    { username: "【此处写你的姓名】", userid: "0-0-0-2" }
                ]
            },
            { username: "0-0-1", userid: "0-0-1" },
            { username: "0-0-2", userid: "0-0-2" }
        ]
    },
    {
        username: "0-1",
        userid: "0-1",
        children: [
            { username: "0-1-0-0", userid: "0-1-0-0" },
            { username: "0-1-0-1", userid: "0-1-0-1" },
            { username: "0-1-0-2", userid: "0-1-0-2" }
        ]
    },
    {
        username: "0-2",
        userid: "0-2"
    }
]

// 问题一:用 ts 描述 treeData 的数据结构
type TreeNode = {
    username: string;
    userid: string;
    children?: TreeNode[];
}

type TreeData = TreeNode[];

let treeData: TreeData = [
    {
        username: "0-0",
        userid: "0-0",
        children: [
            {
                username: "0-0-0",
                userid: "0-0-0",
                children: [
                    { username: "0-0-0-0", userid: "0-0-0-0" },
                    { username: "0-0-0-1", userid: "0-0-0-1" },
                    { username: "【此处写你的姓名】", userid: "0-0-0-2" }
                ]
            },
            { username: "0-0-1", userid: "0-0-1" },
            { username: "0-0-2", userid: "0-0-2" }
        ]
    },
    {
        username: "0-1",
        userid: "0-1",
        children: [
            { username: "0-1-0-0", userid: "0-1-0-0" },
            { username: "0-1-0-1", userid: "0-1-0-1" },
            { username: "0-1-0-2", userid: "0-1-0-2" }
        ]
    },
    {
        username: "0-2",
        userid: "0-2"
    }
]

console.log(treeData); // 问题一:结果输出

// 问题二:用 ts 写一个根据用户名称,查找 userid 的方法。请将你的姓名随机写到上述数据中,用该方法查找出你的姓名对应的 userid
const queryUserIdByUserName: (orgTreeData: TreeData, username: string) => string = function(orgTreeData, username) {

    let userid: string = '';

    orgTreeData.forEach(orgItem => {
        if (orgItem.username === username) {
            userid = orgItem.userid;
        }

        if (orgItem.children && orgItem.children.length) {
            let tempId: string = queryUserIdByUserName(orgItem.children, username);
            if (tempId) userid = tempId;
        }
    })

    return userid;
}

console.log(queryUserIdByUserName(treeData, '【此处写你的姓名】')); // 问题二:结果输出

// 问题三:用 ts 写一个获取最长路径的方法。如以上示例的数据,最长路径为["0-0", "0-0-0", "0-0-0-0"](由 userid 组成,多个最长时返回任意一个即可)
const queryMaxPathHandle: (orgTreeData: TreeData) => string[] = function(orgTreeData) {
    let deepPathList: string[] = []; // 路径集合
    let maxDeepPath = 0; // 最大路径层级

    // 最深优先计算
    function depthFirstHandle(orgItem: { userid: string, username: string, children?: TreeData }, currentPath: string[], depth: number) {
        currentPath.push(orgItem.userid);

        if (depth > maxDeepPath) {
            deepPathList = [...currentPath];
            maxDeepPath = depth;
        }

        if (orgItem.children && orgItem.children.length > 0) {
            for (let child of orgItem.children) {
                depthFirstHandle(child, currentPath, depth + 1);
            }
        }

        currentPath.pop();
    }

    for (const orgItem of orgTreeData) {
        depthFirstHandle(orgItem, [], 1);
    }

    return deepPathList;
}

console.log(queryMaxPathHandle(treeData)); // 问题三:结果输出


发表评论