简体   繁体   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

How to get all child and super-child data into main parent data as a childList as basic of commentId and _id on loop in an array of javascript recursion method.如何将所有子数据和超子数据作为 childList 作为 javascript 递归方法数组中循环的commentId_id的基础获取到主父数据中。

If commentId is null means it's a parent data else commentId is same as another data's _id means it's a child of that item.如果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 need to be: all child and super child data need to be added into main parent data as childList of parent data whose commentId is null. 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
  }
]

Mapping objects to their._id and getFurthestAncestor()将对象映射到它们的 ._id 和 getFurthestAncestor()

You may first have an object mapping each object found in the data array to its corresponding _id property value so that you'll have a criteria to filter items by furthest ancestor.您可能首先有一个 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;      
}

Folding ancestors objects pushing their descendents in.descendents折叠祖先对象将其后代推入.descendents

Then you can just filter out the root elements (objects having commentId property as null) and on them add the descendents property as an array including all the elements having that corresponding furthest ancestor:然后你可以过滤掉根元素(具有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;
  });

Demo演示

Here in this demo the entry point just runs as:在此演示中,入口点运行如下:

const result = getFoldedAncestors(data);
console.log( result );

And will print on console the object as what you expected in your question:并将按照您在问题中的预期在控制台上打印 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