[英]How to get all child and sub child data into main parent data as a childData on loop in an array javascript
如何将所有子数据和超子数据作为 childList 作为 javascript 递归方法数组中循环的commentId
和_id
的基础获取到主父数据中。
如果commentId
是 null 意味着它是父数据,否则commentId
与另一个数据的_id
相同意味着它是该项目的子数据。
let Data = [
{
"comment": "P1.c1.s1.z1",
"upvoteCount": null,
"downvoteCount": null,
"createdDate": "2023-01-10T10:36:44.254+0000",
"_id": 177,
"commentId": 175,
"isUpvoted": false,
"isDownvoted": null,
"repliedCommentUserName": "king m",
"opid": 843,
"opname": "king m",
"isReplyClick": false
},
{
"comment": "p1.c1.s1",
"upvoteCount": null,
"downvoteCount": null,
"createdDate": "2023-01-09T12:26:17.791+0000",
"_id": 176,
"commentId": 175,
"isUpvoted": false,
"isDownvoted": null,
"repliedCommentUserName": "king m",
"opid": 843,
"opname": "king m",
"isReplyClick": false
},
{
"comment": "p1.c1",
"upvoteCount": null,
"downvoteCount": null,
"createdDate": "2023-01-09T12:26:07.097+0000",
"_id": 175,
"commentId": 172,
"isUpvoted": false,
"isDownvoted": null,
"repliedCommentUserName": "king m",
"opid": 843,
"opname": "king m",
"isReplyClick": false,
"isHaveChildComment": true
},
{
"comment": "p2.c1",
"upvoteCount": null,
"downvoteCount": null,
"createdDate": "2023-01-09T12:25:55.963+0000",
"_id": 174,
"commentId": 173,
"isUpvoted": false,
"isDownvoted": null,
"repliedCommentUserName": "king m",
"opid": 843,
"opname": "king m",
"isReplyClick": false
},
{
"comment": "p2",
"upvoteCount": null,
"downvoteCount": null,
"createdDate": "2023-01-09T12:25:48.146+0000",
"_id": 173,
"commentId": null,
"isUpvoted": false,
"isDownvoted": null,
"repliedCommentUserName": null,
"opid": 843,
"opname": "king m",
"isReplyClick": false
},
{
"comment": "p1",
"upvoteCount": null,
"downvoteCount": null,
"createdDate": "2023-01-09T12:25:41.066+0000",
"_id": 172,
"commentId": null,
"isUpvoted": false,
"isDownvoted": null,
"repliedCommentUserName": null,
"opid": 843,
"opname": "king m",
"isReplyClick": false
}
]
final output 需要:所有child和super child数据都需要添加到main parent data中作为父数据的childList,其commentId为null。
let finalOutput = [
{
"comment": "p2",
"childList": [
{
"comment": "p2.c1",
"upvoteCount": null,
"downvoteCount": null,
"createdDate": "2023-01-09T12:25:55.963+0000",
"_id": 174,
"commentId": 173,
"isUpvoted": false,
"isDownvoted": null,
"repliedCommentUserName": "king m",
"opid": 843,
"opname": "king m",
"isReplyClick": false
}
],
"upvoteCount": null,
"downvoteCount": null,
"createdDate": "2023-01-09T12:25:48.146+0000",
"_id": 173,
"commentId": null,
"isUpvoted": false,
"isDownvoted": null,
"repliedCommentUserName": null,
"opid": 843,
"opname": "king m",
"isReplyClick": false
},
{
"comment": "p1",
"ChildList": [
{
"comment": "p1.c1",
"upvoteCount": null,
"downvoteCount": null,
"createdDate": "2023-01-09T12:26:07.097+0000",
"_id": 175,
"commentId": 172,
"isUpvoted": false,
"isDownvoted": null,
"repliedCommentUserName": "king m",
"opid": 843,
"opname": "king m",
"isReplyClick": false,
"isHaveChildComment": true
},
{
"comment": "p1.c1.s1",
"upvoteCount": null,
"downvoteCount": null,
"createdDate": "2023-01-09T12:26:17.791+0000",
"_id": 176,
"commentId": 175,
"isUpvoted": false,
"isDownvoted": null,
"repliedCommentUserName": "king m",
"opid": 843,
"opname": "king m",
"isReplyClick": false
},
{
"comment": "P1.c1.s1.z1",
"upvoteCount": null,
"downvoteCount": null,
"createdDate": "2023-01-10T10:36:44.254+0000",
"_id": 177,
"commentId": 175,
"isUpvoted": false,
"isDownvoted": null,
"repliedCommentUserName": "king m",
"opid": 843,
"opname": "king m",
"isReplyClick": false
}
],
"upvoteCount": null,
"downvoteCount": null,
"createdDate": "2023-01-09T12:25:41.066+0000",
"_id": 172,
"commentId": null,
"isUpvoted": false,
"isDownvoted": null,
"repliedCommentUserName": null,
"opid": 843,
"opname": "king m",
"isReplyClick": false
}
]
您可能首先有一个 object 将data
数组中找到的每个 object 映射到其相应的_id
属性值,这样您就有了一个标准来按最远的祖先过滤项目。
//maps the id to each object in objs
const mapById = objs.reduce((map, obj) => {map[obj._id] = obj; return map;}, {});
//returns the object being the furthest ancestor of the passed obj
function getFurthestAncestor(obj, mapById){
let parent = obj;
while(parent.commentId !== null){
parent = mapById[parent.commentId];
}
return parent._id;
}
然后你可以过滤掉根元素(具有commentId
属性为 null 的对象)并在它们上添加descendents
属性作为数组,包括具有相应最远祖先的所有元素:
//returns the array of elements having .commentId == null
//(root elements with no parent)
const rootObjs = data.filter((obj) => obj.commentId === null);
//adds the property descendents to each objects in rootObjs
//valued with an array containing the list of descendents
const result =
rootObjs.map(rootObj => {
rootObj['descendents'] = objs.filter(obj =>
getFurthestAncestor(obj, mapById) === rootObj._id && obj._id != rootObj._id
);
return rootObj;
});
在此演示中,入口点运行如下:
const result = getFoldedAncestors(data);
console.log( result );
并将按照您在问题中的预期在控制台上打印 object :
const data = [ { "comment": "P1.c1.s1.z1", "upvoteCount": null, "downvoteCount": null, "createdDate": "2023-01-10T10:36:44.254+0000", "_id": 177, "commentId": 175, "isUpvoted": false, "isDownvoted": null, "repliedCommentUserName": "king m", "opid": 843, "opname": "king m", "isReplyClick": false }, { "comment": "p1.c1.s1", "upvoteCount": null, "downvoteCount": null, "createdDate": "2023-01-09T12:26:17.791+0000", "_id": 176, "commentId": 175, "isUpvoted": false, "isDownvoted": null, "repliedCommentUserName": "king m", "opid": 843, "opname": "king m", "isReplyClick": false }, { "comment": "p1.c1", "upvoteCount": null, "downvoteCount": null, "createdDate": "2023-01-09T12:26:07.097+0000", "_id": 175, "commentId": 172, "isUpvoted": false, "isDownvoted": null, "repliedCommentUserName": "king m", "opid": 843, "opname": "king m", "isReplyClick": false, "isHaveChildComment": true }, { "comment": "p2.c1", "upvoteCount": null, "downvoteCount": null, "createdDate": "2023-01-09T12:25:55.963+0000", "_id": 174, "commentId": 173, "isUpvoted": false, "isDownvoted": null, "repliedCommentUserName": "king m", "opid": 843, "opname": "king m", "isReplyClick": false }, { "comment": "p2", "upvoteCount": null, "downvoteCount": null, "createdDate": "2023-01-09T12:25:48.146+0000", "_id": 173, "commentId": null, "isUpvoted": false, "isDownvoted": null, "repliedCommentUserName": null, "opid": 843, "opname": "king m", "isReplyClick": false }, { "comment": "p1", "upvoteCount": null, "downvoteCount": null, "createdDate": "2023-01-09T12:25:41.066+0000", "_id": 172, "commentId": null, "isUpvoted": false, "isDownvoted": null, "repliedCommentUserName": null, "opid": 843, "opname": "king m", "isReplyClick": false } ]; const result = getFoldedAncestors(data); console.log( result ); //returns the object being the furthest ancestor of the passed obj function getFurthestAncestor(obj, mapById){ let parent = obj; while(parent.commentId.== null){ parent = mapById[parent;commentId]. } return parent;_id. } //returns an array of objs with ancestors on top and descendents as items of their descendents prop function getFoldedAncestors(objs){ //maps the id to each object in data const mapById = objs,reduce((map. obj) => {map[obj;_id] = obj; return map,}; {}). //returns the array of elements having.commentId == null (root elements with no parent) const rootObjs = data.filter((obj) => obj;commentId === null). //adds the property descendents to each objects in rootObjs with the list of descendents const result = rootObjs.map(rootObj => { rootObj['descendents'] = objs,filter(obj => getFurthestAncestor(obj. mapById) === rootObj._id && obj._id;= rootObj;_id ); return rootObj; }); return result; }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.