怎么递归输出这个对象?

发布于 2022-08-28 11:55:47 字数 1325 浏览 14 评论 0

var orz = {
    it: {
        facebook: {
            apple: {
                google: {
                    twitter: {}
                },
                microsoft: {}
            }
        }
    },
    china: {}
};

function objLength(obj) {
    var j = 0;
    for (i in obj) {
        j++;
    }
    return j;
}

function re(ja, num, tree, jn) {
    if (objLength(ja) == 0) {
        return;
    }
    if ("undefined" == typeof num) {
        num = 0;
    }
    if ("undefined" == typeof tree) {
        tree = [];
    }
    if ("undefined" != typeof jn) {
        tree.push(jn);
    }
    num++;
    fo(ja, tree, num);

    function fo(a, b, c) {
        for (x in a) {
            if (b.length > 0) {
                console.log(c + ": " + b + "," + x);
            } else {
                console.log(c + ": " + x);
            }
            re(a[x], c, b, x);
        }
    }
}

re(orz);

/**
 * 为什么结果是:
 * 1: it
 * 2: it,facebook
 * 3: it,facebook,apple
 * 4: it,facebook,apple,google
 * 5: it,facebook,apple,google,twitter
 * 4: it,facebook,apple,google,microsoft
 * 1: it,facebook,apple,google,china
 * 而不是
 * 1: it
 * 2: it,facebook
 * 3: it,facebook,apple
 * 4: it,facebook,apple,google
 * 5: it,facebook,apple,google,twitter
 * 4: it,facebook,apple,microsoft
 * 1: china
 *
 */
修改

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

七度光 2022-09-04 11:55:47
var orz = {
    it: {
        facebook: {
            apple: {
                google: {
                    twitter: {}
                },
                microsoft: {}
            }
        }
    },
    china: {}
};

var result = [];

function re(obj, prev) {
    Object.keys(obj).forEach(function(item) {
        var hehe = '';
        if (obj[item] instanceof Object && !(obj[item] instanceof Array)) {
        //如果数组也算,使用下边的条件
        //if (obj[item] instanceof Object) {
            hehe = (prev.length ? prev + ',' + item : item);
            result.push(hehe);
            re(obj[item], hehe);
        }
    });
}
re(orz, '');
console.log(result);
风追烟花雨 2022-09-04 11:55:47

因为你用了push,所以当循环遍历到google时,tree为["it", "facebook", "apple", "google"],接下来console输出的三个记录就是:
5: it,facebook,apple,google,twitter
4: it,facebook,apple,google,microsoft
1: it,facebook,apple,google,china
解决方法有两个:
1.push后进行pop操作

num++;
fo(ja, tree, num);
tree.pop(jn);

2.使用String代替Array

tree += jn;
宁愿没拥抱 2022-09-04 11:55:47
var orz = {
    it: {
        facebook: {
            apple: {
                google: {
                    twitter: {}
                },
                microsoft: {}
            }
        }
    },
    china: {}
};

var re=function(current,path){
    for(var c in current){
        path.push(c);
        console.log(path.length + ":"+ path.join(","));
        re(current[c],path);
        path.pop();
    }
}

re(orz,[]);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文