|  | @@ -0,0 +1,77 @@
 | 
	
		
			
				|  |  | +/*
 | 
	
		
			
				|  |  | + * @Description: 备份晨晨的代码
 | 
	
		
			
				|  |  | + * @Autor: kindring
 | 
	
		
			
				|  |  | + * @Date: 2021-09-16 15:19:12
 | 
	
		
			
				|  |  | + * @LastEditors: kindring
 | 
	
		
			
				|  |  | + * @LastEditTime: 2021-09-16 15:19:13
 | 
	
		
			
				|  |  | + * @LastDescript: 
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +let input = {
 | 
	
		
			
				|  |  | +    a: {
 | 
	
		
			
				|  |  | +        b: "123",
 | 
	
		
			
				|  |  | +        c: {
 | 
	
		
			
				|  |  | +            d: 456,
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    b: {
 | 
	
		
			
				|  |  | +        e: 789,
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    f: 222,
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +const recursive = (tree, domain) =>
 | 
	
		
			
				|  |  | +    Object.entries(tree)
 | 
	
		
			
				|  |  | +    .map(([key, value]) => [value, domain ? `${domain}.${key}` : key])
 | 
	
		
			
				|  |  | +    .map(([value, subDomain]) =>
 | 
	
		
			
				|  |  | +        typeof value === "object" ? recursive(value, subDomain) : subDomain
 | 
	
		
			
				|  |  | +    )
 | 
	
		
			
				|  |  | +    .flat();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +function depthFirst(tree) {
 | 
	
		
			
				|  |  | +    const stack = [
 | 
	
		
			
				|  |  | +        [tree, ""]
 | 
	
		
			
				|  |  | +    ];
 | 
	
		
			
				|  |  | +    const res = [];
 | 
	
		
			
				|  |  | +    while (stack.length) {
 | 
	
		
			
				|  |  | +        const [crt, crtPath] = stack.pop();
 | 
	
		
			
				|  |  | +        if (typeof crt === "object") {
 | 
	
		
			
				|  |  | +            const entries = Object.entries(crt);
 | 
	
		
			
				|  |  | +            let i = entries.length;
 | 
	
		
			
				|  |  | +            while (i--) {
 | 
	
		
			
				|  |  | +                const [key, value] = entries[i];
 | 
	
		
			
				|  |  | +                const path = crtPath ? `${crtPath}.${key}` : key;
 | 
	
		
			
				|  |  | +                stack.push([value, path]);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        } else {
 | 
	
		
			
				|  |  | +            res.push(crtPath);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    return res;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +function widthFirst(tree) {
 | 
	
		
			
				|  |  | +    const queue = [
 | 
	
		
			
				|  |  | +        [tree, ""]
 | 
	
		
			
				|  |  | +    ];
 | 
	
		
			
				|  |  | +    const res = [];
 | 
	
		
			
				|  |  | +    while (queue.length) {
 | 
	
		
			
				|  |  | +        const [crt, crtPath] = queue.shift();
 | 
	
		
			
				|  |  | +        if (typeof crt === "object") {
 | 
	
		
			
				|  |  | +            const entries = Object.entries(crt);
 | 
	
		
			
				|  |  | +            const last = entries.length - 1;
 | 
	
		
			
				|  |  | +            let i = -1;
 | 
	
		
			
				|  |  | +            while (i++ < last) {
 | 
	
		
			
				|  |  | +                const [key, value] = entries[i];
 | 
	
		
			
				|  |  | +                const path = crtPath ? `${crtPath}.${key}` : key;
 | 
	
		
			
				|  |  | +                queue.push([value, path]);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        } else {
 | 
	
		
			
				|  |  | +            res.push(crtPath);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    return res;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +console.log(recursive(input));
 | 
	
		
			
				|  |  | +console.log(depthFirst(input));
 | 
	
		
			
				|  |  | +console.log(widthFirst(input));
 |