首页 > 解决方案 > 使用 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 }]
    },
];

标签: javascriptphpalgorithmcommentsreply

解决方案


这里的嵌套对象基本上就像一棵树,注释变成了树节点。首先,创建一个具有 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);


推荐阅读