递归重构对象 JavaScript



因此,这是我获取与其相应主题相关的所有帖子的方法。

const moment = require('moment');
const mongoose = require('mongoose');
mongoose.Promise = global.Promise;
const Post = require('../models/Post');
let posts = {
    getPosts: function(req, res) {
        return Post.find({ topicId: req.params._id })
            .then(function(result) {
                console.log('------------------------------------');
                console.log('Headed to the Client: ', result);
                console.log('------------------------------------');
                res.json(result);
            })
            .catch(function(error) {
                console.log('Nope! Nerd!');
                return Promise.reject(error);
            })
    }
}

结果是这样的:

[ { _id: 58deac2223b5b92ce45bdfac,
    topicId: '58dd6f541919c541dbf9632d',
    parentId: null,
    content: '1 Post',
    author: 'Bob',
    createdAt: 2017-03-31T19:21:06.698Z,
    isAnon: false,
    __v: 0,
    comments: [],
    isArchieved: false,
    isParent: true },
  { _id: 58deac2c23b5b92ce45bdfad,
    topicId: '58dd6f541919c541dbf9632d',
    parentId: null,
    content: '2 Post',
    author: 'Bob',
    createdAt: 2017-03-31T19:21:16.622Z,
    isAnon: false,
    __v: 0,
    comments: [],
    isArchieved: false,
    isParent: true },
  { _id: 58deac3c23b5b92ce45bdfae,
    topicId: '58dd6f541919c541dbf9632d',
    parentId: null,
    content: '3 Post',
    author: 'Bob',
    createdAt: 2017-03-31T19:21:32.682Z,
    isAnon: false,
    __v: 0,
    comments: [],
    isArchieved: false,
    isParent: true },
  { _id: 58deac5e23b5b92ce45bdfaf,
    topicId: '58dd6f541919c541dbf9632d',
    parentId: '58deac3c23b5b92ce45bdfae',
    content: '1 Comment',
    author: 'Kat',
    createdAt: 2017-03-31T19:22:06.974Z,
    isAnon: false,
    __v: 0,
    comments: [],
    isArchieved: false,
    isParent: false },
  { _id: 58deac6c23b5b92ce45bdfb0,
    topicId: '58dd6f541919c541dbf9632d',
    parentId: '58deac2223b5b92ce45bdfac',
    content: '2 Comment',
    author: 'Dave',
    createdAt: 2017-03-31T19:22:20.071Z,
    isAnon: false,
    __v: 0,
    comments: [],
    isArchieved: false,
    isParent: false },
 { _id: 58deac7a23b5b92ce45bdfb1,
    topicId: '58dd6f541919c541dbf9632d',
    parentId: '58deac2c23b5b92ce45bdfad',
    content: '4 Comment',
    author: 'Bob',
    createdAt: 2017-03-31T19:22:34.865Z,
    isAnon: false,
    __v: 0,
    comments: [],
    isArchieved: false,
    isParent: false } ]

我陷入困境,因为我需要在它从数据库中出来后修改此列表,以获取带有 parentId 的帖子并将它们推送到相应的父母评论数组中。

因此,实际发送给客户端的结果如下所示:

                [{
                    _id: 58deac2223b5b92ce45bdfa',
                    topicId: '58dd6f541919c541dbf9632d',
                    parentId: null,
                    content: '1 Post',
                    author: 'Bob',
                    isAnon: false,
                    __v: 0,
                    comments: [{
                        _id: 58deac6c23b5b92ce45bdfb0,
                        topicId: '58dd6f541919c541dbf9632d',
                        parentId: '58deac2223b5b92ce45bdfac',
                        content: '2 Comment',
                        author: 'Dave',
                        isAnon: false,
                        __v: 0,
                        comments: [],
                        isArchieved: false,
                        isParent: false
                    }],
                    isArchieved: false,
                    isParent: true
                },
                {
                    _id: 58deac2c23b5b92ce45bdfad,
                    topicId: '58dd6f541919c541dbf9632d',
                    parentId: null,
                    content: '2 Post',
                    author: 'Bob',
                    isAnon: false,
                    __v: 0,
                    comments: [{
                        _id: 58deac7a23b5b92ce45bdfb1,
                        topicId: '58dd6f541919c541dbf9632d',
                        parentId: '58deac2c23b5b92ce45bdfad',
                        content: '4 Comment',
                        author: 'Bob',
                        isAnon: false,
                        __v: 0,
                        comments: [],
                        isArchieved: false,
                        isParent: false
                    }],
                    isArchieved: false,
                    isParent: true
                },
                {
                    _id: 58deac3c23b5b92ce45bdfae,
                    topicId: '58dd6f541919c541dbf9632d',
                    parentId: null,
                    content: '3 Post',
                    author: 'Bob',
                    isAnon: false,
                    __v: 0,
                    comments: [{
                        _id: 58deac5e23b5b92ce45bdfaf,
                        topicId: '58dd6f541919c541dbf9632d',
                        parentId: '58deac3c23b5b92ce45bdfae',
                        content: '1 Comment',
                        author: 'Kat',
                        isAnon: false,
                        __v: 0,
                        comments: [],
                        isArchieved: false,
                        isParent: false
                    }],
                    isArchieved: false,
                    isParent: true
                }
            ]

我知道我需要递归数组,但我被两者之间的逻辑难住了。任何帮助将不胜感激。非常感谢。

可以使用对象来收集所有节点,并将找到的子节点追加到 comments 属性。获取以 parentId === null 作为根节点的节点。

此方法适用于任何深度的未排序数据,并使用单个循环来获取嵌套结果。

var data = [{ _id: '58deac2223b5b92ce45bdfac', topicId: '58dd6f541919c541dbf9632d', parentId: null, content: '1 Post', author: 'Bob', createdAt: '2017-03-31T19:21:06.698Z', isAnon: false, __v: 0, comments: [], isArchieved: false, isParent: true }, { _id: '58deac2c23b5b92ce45bdfad', topicId: '58dd6f541919c541dbf9632d', parentId: null, content: '2 Post', author: 'Bob', createdAt: '2017-03-31T19:21:16.622Z', isAnon: false, __v: 0, comments: [], isArchieved: false, isParent: true }, { _id: '58deac3c23b5b92ce45bdfae', topicId: '58dd6f541919c541dbf9632d', parentId: null, content: '3 Post', author: 'Bob', createdAt: '2017-03-31T19:21:32.682Z', isAnon: false, __v: 0, comments: [], isArchieved: false, isParent: true }, { _id: '58deac5e23b5b92ce45bdfaf', topicId: '58dd6f541919c541dbf9632d', parentId: '58deac3c23b5b92ce45bdfae', content: '1 Comment', author: 'Kat', createdAt: '2017-03-31T19:22:06.974Z', isAnon: false, __v: 0, comments: [], isArchieved: false, isParent: false }, { _id: '58deac6c23b5b92ce45bdfb0', topicId: '58dd6f541919c541dbf9632d', parentId: '58deac2223b5b92ce45bdfac', content: '2 Comment', author: 'Dave', createdAt: '2017-03-31T19:22:20.071Z', isAnon: false, __v: 0, comments: [], isArchieved: false, isParent: false }, { _id: '58deac7a23b5b92ce45bdfb1', topicId: '58dd6f541919c541dbf9632d', parentId: '58deac2c23b5b92ce45bdfad', content: '4 Comment', author: 'Bob', createdAt: '2017-03-31T19:22:34.865Z', isAnon: false, __v: 0, comments: [], isArchieved: false, isParent: false }],
    tree = function (data, root) {
        var r = [],
            o = {};
        data.forEach(function (a) {
            a.comments = (o[a._id] && o[a._id].comments || []).concat();
            o[a._id] = a;
            if (a.parentId === root) {
                r.push(a);
            } else {
                o[a.parentId] = o[a.parentId] || {};
                o[a.parentId].comments = o[a.parentId].comments || [];
                o[a.parentId].comments.push(a);
            }
        });
        return r;
    }(data, null);
    
console.log(tree);
.as-console-wrapper { max-height: 100% !important; top: 0; }

最新更新