我有一批评论,他们的格式类似
[
{
commentID:1,
comment_parentID:0
},
{
commentID:2,
comment_parentID:1
},
{
commentID:3,
comment_parentID:0
},
{
commentID:4,
comment_parentID:2
},
{
commentID:5,
comment_parentID:1
}
]
所有层级的评论都被平铺开来为一层,现在我要变为多层的
[
{
commentID:1,
comments:[
{
commentID:2,
comment_parentID:1,
comments:[
{
commentID:4,
comment_parentID:2
},
]
},
{
commentID:5,
comment_parentID:1
}
]
},
{
commentID:3,
comment_parentID:0
}
]
如何循环才能最快,他们的顺序不一定是正序到倒叙,是有可能乱的. ID 是唯一的.
1
lhx2008 2017-06-24 18:39:44 +08:00 via Android
标题有歧义啊
|
2
chairuosen 2017-06-24 18:45:45 +08:00
先写个 map id=>obj 方便查找
然后遍历原始数据每一项如果有父级找到父级对象塞 children 里,然后再把根节点拎出来排个序就行 大概是两遍循环 |
3
hoythan OP @chairuosen 他有多层
|
4
cuebyte 2017-06-24 18:56:02 +08:00
双向链表,由子找父
|
6
geelaw 2017-06-24 20:17:24 +08:00
/* in-place, destructive */
function treefy(inputArray) { var outputArray = []; inputArray.forEach(function (comment) { comment.comments = []; }); inputArray.sort(function (a, b) { return a.commentID - b.commentID; }); var helper = function (begin, end, n) { if (begin >= end) return null; var mid = (begin + end) >> 1; var testee = outputArray[mid].commentID; return testee < n ? helper(begin, mid, n) : testee > n ? helper(mid + 1, end, n) : outputArray[mid]; }; inputArray.forEach(function (comment) { if (comment.comment_parentID == 0) outputArray.push(comment); else helper(0, inputArray.length, comment.comment_parentID).comments.push(comment); }); return outputArray; } 没有测试过, provided as-is. |