1

我正在处理按投票排序的评论线程。我有一个看起来像这样的基础对象。

{
"user_name": "string",
"comment": "string",
"points": "integer",
"date_time": "dateObject",
"avatar_pic": "URL",
"profile_link": "URL"
}

你现在可以忽略一切都是字符串的事实。只是为了测试而这样做。

这是带有多个评论的较大对象。会有一个未知的嵌套深度。

{
"comments": [
    {
        "user_name": "string",
        "comment": "string",
        "points": "integer",
        "date_time": "dateObject",
        "child": [
            {
                "user_name": "string",
                "comment": "string",
                "points": "integer",
                "date_time": "dateObject",
                "child" : null,
            }
        ]
    },
    {
        "user_name": "string",
        "comment": "string",
        "points": "integer",
        "date_time": "dateObject",
        "child": null
    }
]

}

我现在在伪代码中的工作理论是这样的。

for each iteration of loop over comments array call someFunction

someFunction(){
for by points
write properties of object to screen
check if child property has an array.  If array call someFunction on that array.
}

基本上 for 循环会自动检查嵌套。然后,如果它进一步向下循环并继续在屏幕上按逻辑顺序构建评论。我要记住的唯一其他要求是嵌套深度。我想根据嵌套级别缩进评论。最多缩进 3 或 4 个,然后它们会直接向下而不是在页面上进一步缩进。

较大的格式是完全灵活的。如果有更好的数据结构可以使用,我会全力以赴。我希望这是有道理的,你们摇滚!!

4

3 回答 3

1
function process (obj, func) {
    func(obj);
    if (obj.child) {
        obj.child.forEach(function (child) {
            process(child, func);
        });
    }
}

用法:

process(yourObj, function (obj) {
    // e.g.
    cosnole.log(obj.user_name);
});
于 2013-07-14T20:46:20.413 回答
1

如果我正确理解您要做什么,您的伪代码将如下所示:

someFunction(){
if child property has an array -> call someFunction()  

else child property has null -> process, and then set this very child to null, and call someFunction again
}

为了更好地监督这些类型的对象遍历,您应该查看图表和遍历它们的特殊方式,深度优先搜索,这与我理解您想要做的事情非常接近

于 2013-07-14T20:54:51.273 回答
0

如果您需要嵌套评论,IMO 结构很好。如果你不这样做,拥有它不会消耗太多资源。我建议在将其打印到 html 时保存每个评论深度,然后您可以根据需要设置它的样式。

于 2013-07-14T20:44:50.550 回答