javascript - 使用 php 或 javascript 排序评论数据算法
问题描述
const comments = [
{ 'id': 1, 'origin_id': 0 },
{ 'id': 2, 'origin_id': 0 },
{ 'id': 3, 'origin_id': 2 },
{ 'id': 4, 'origin_id': 2 },
{ 'id': 5, 'origin_id': 3 },
{ 'id': 6, 'origin_id': 3 },
{ 'id': 7, 'origin_id': 0 },
{ 'id': 8, 'origin_id': 0 },
{ 'id': 9, 'origin_id': 0 },
{ 'id': 10, 'origin_id': 0 },
];
// or? data structure somthing like this? i dont konw how to use such order and depth.
const comments = [
{ 'id': 1, 'origin_id': 0, 'reply_order': 0, 'reply_depth': 0 },
{ 'id': 2, 'origin_id': 0, 'reply_order': 0, 'reply_depth': 0 },
{ 'id': 3, 'origin_id': 2, 'reply_order': 0, 'reply_depth': 0 },
{ 'id': 4, 'origin_id': 2, 'reply_order': 0, 'reply_depth': 0 },
{ 'id': 5, 'origin_id': 3, 'reply_order': 0, 'reply_depth': 0 },
{ 'id': 6, 'origin_id': 3, 'reply_order': 0, 'reply_depth': 0 },
{ 'id': 7, 'origin_id': 0, 'reply_order': 0, 'reply_depth': 0 },
{ 'id': 8, 'origin_id': 0, 'reply_order': 0, 'reply_depth': 0 },
{ 'id': 9, 'origin_id': 0, 'reply_order': 0, 'reply_depth': 0 },
{ 'id': 10, 'origin_id': 0, 'reply_order': 0, 'reply_depth': 0 },
];
我想要一些算法,比如评论中的评论。只有这么多的数据,这是否可能?
如果有人知道实现该目标的更好方法,请告诉我。
我想这个概念。任何代码语言对我来说都可以。但我更喜欢 PHP 和 JS。
const comments = [
{ 'id': 1, 'origin_id': 0 },
{ 'id': 2, 'origin_id': 0 },
{ 'id': 3, 'origin_id': 2 },
{ 'id': 4, 'origin_id': 2 },
{ 'id': 5, 'origin_id': 3 },
{ 'id': 6, 'origin_id': 3 },
];
// result i expected;
const result_comments = [
{ 'id': 1, 'origin_id': 0 },
{
'id': 2, 'origin_id': 0,
'children': [{
'id': 3, 'origin_id': 2, 'children': [{ 'id': 5, 'origin_id': 3 },
{ 'id': 6, 'origin_id': 3 },]
}, { 'id': 4, 'origin_id': 2 }]
},
];
解决方案
这里的嵌套对象基本上就像一棵树,注释变成了树节点。首先,创建一个具有 children 属性的字典,然后从中分配子项。
评论id是按升序创建的,创建后不需要重新排序。
// assuming that id are sorted, else you have to sort comments by id.
const comments = [
{ 'id': 1, 'origin_id': 0 },
{ 'id': 2, 'origin_id': 0 },
{ 'id': 3, 'origin_id': 2 },
{ 'id': 4, 'origin_id': 2 },
{ 'id': 5, 'origin_id': 3 },
{ 'id': 6, 'origin_id': 3 },
];
// creating dictinary where key is id and value is object with added children property
let dic = comments.reduce((acc, obj) => (acc[obj.id] = {...obj, children : [] }, acc), {});
// initial set
let treeRoot = {'id': 0, 'origin_id': 0 , children : []};
// adding in dictionary so i can add origin_id 0 to tree root
dic[treeRoot.id] = treeRoot;
// populating the childrens
comments.forEach(obj => dic[obj.origin_id].children.push(dic[obj.id]));
// if you want the array that inside treeRoot.children
console.log(treeRoot);
推荐阅读
- microsoft-graph-api - MS Graph SDK .NET 使用 documentLibrary 模板查询所有列表
- python - Python中的一行中的'for'循环
- javascript - 使用 querySelector 选择具有特定值的 Div
- mysql - 我的 SQL 代码有什么问题?它显示错误代码 1064
- javascript - 防止输入负数 Mongoose Schema
- google-apps-script - Google Apps 脚本 - 无法读取 Google 文档中段落的粗体属性
- java - npm run android commad 给出找不到符号错误
- node.js - 授权、令牌和 nodejs
- android - 用户接听电话问题的系统权限
- linux - 我用什么 glob 在 linux 的文件中查找特定字母