繁体   English   中英

如何将所有子数据和子数据作为数组中循环的 childData 放入主父数据中 javascript

[英]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
  }
]

将对象映射到它们的 ._id 和 getFurthestAncestor()

您可能首先有一个 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;      
}

折叠祖先对象将其后代推入.descendents

然后你可以过滤掉根元素(具有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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM