javascript - 使用 Javascript 推送嵌套数组注释

标签 javascript arrays comments push

我从服务器得到一个像这样的注释数组:

var comments = [{
    id: 1,
    text: 'Lorem ipsum dolor sit amet... ',
    parent: []
}, {
    id: 2,
    text: 'Lorem ipsum dolor sit amet... ',
    parent: []
}, {
    id: 3,
    text: 'Lorem ipsum dolor sit amet... ',
    parent: [1]
}, {
    id: 4,
    text: 'Lorem ipsum dolor sit amet... ',
    parent: [1]
}, {
    id: 5,
    text: 'Lorem ipsum dolor sit amet... ',
    parent: [1, 3]
}, {
    id: 6,
    text: 'Lorem ipsum dolor sit amet... ',
    parent: []
}];

每个对象的父数组是其父对象及其之上的地址。 所以我想将每个评论推送到新回复数组项目中的正确父级。 我用这种方式对评论进行排序:

var sort = function(a, b) {
    if (a.pasokh.length < b.pasokh.length) {
        return 1;
    }
    if (a.pasokh.length > b.pasokh.length) {
        return -1;
    }
    // a must be equal to b
    return 0;
};

comments.sort(sort);

然后像这样获取数组:

[{
    id: 5,
    text: 'Lorem ipsum dolor sit amet... ',
    parent: [1, 3]
}, {
    id: 3,
    text: 'Lorem ipsum dolor sit amet... ',
    parent: [1]
}, {
    id: 4,
    text: 'Lorem ipsum dolor sit amet... ',
    parent: [1]
}, {
    id: 1,
    text: 'Lorem ipsum dolor sit amet... ',
    parent: []
}, {
    id: 2,
    text: 'Lorem ipsum dolor sit amet... ',
    parent: []
}, {
    id: 6,
    text: 'Lorem ipsum dolor sit amet... ',
    parent: []
}]

评论的顺序可能与上面不完全正确。 将 id:5 推送到 id:3 以及 id:3 & id:4toid:1` 并获取的最佳方法是什么像这样的数组:

[{
    id: 1,
    text: 'Lorem ipsum dolor sit amet... ',
    parent: [],
    reply: [{
        id: 3,
        text: 'Lorem ipsum dolor sit amet... ',
        parent: [1],
        reply: [{
            id: 5,
            text: 'Lorem ipsum dolor sit amet... ',
            parent: [1, 3]
        }, ]
    }, {
        id: 4,
        text: 'Lorem ipsum dolor sit amet... ',
        parent: [1]
    }, ]
}, {
    id: 2,
    text: 'Lorem ipsum dolor sit amet... ',
    parent: []
}, {
    id: 6,
    text: 'Lorem ipsum dolor sit amet... ',
    parent: []
}]

最佳答案

此提案适用于未排序的数据。它以 id 作为引用,甚至将未知的 id 对象应用于临时对象,并稍后用给定的数据填充它。这意味着该解决方案只需要一个循环。

var comments = [{ id: 1, text: 'Lorem ipsum dolor sit amet... ', parent: [] }, { id: 2, text: 'Lorem ipsum dolor sit amet... ', parent: [] }, { id: 3, text: 'Lorem ipsum dolor sit amet... ', parent: [1] }, { id: 4, text: 'Lorem ipsum dolor sit amet... ', parent: [1] }, { id: 5, text: 'Lorem ipsum dolor sit amet... ', parent: [1, 3] }, { id: 6, text: 'Lorem ipsum dolor sit amet... ', parent: [] }],
    tree = function (array) {
        var r = [],
            o = Object.create(null);

        array.forEach(function (a) {
            var id;
            a.reply = o[a.id] && o[a.id].reply;
            o[a.id] = a;
            id = a.parent.reduce(function (r, a) {
                r !== null && !(a in o) && o[r].reply.push(o[a] = {});
                return a;
            }, null);
            if (id !== null) {
                o[id].reply = o[id].reply || [];
                o[id].reply.push(a);
            } else {
                r.push(o[a.id]);
            }
        });
        return r;
    }(comments);

console.log(tree);
.as-console-wrapper { max-height: 100% !important; top: 0; }

关于javascript - 使用 Javascript 推送嵌套数组注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41058465/

相关文章:

java - IntelliJ IDEA - 在 Java 文档注释中渲染 HTML 标记

ide - 在 Aptana Studio 3.0 中查找注释代码的快捷方式

vim - 在vim中很好地格式化长//注释

javascript - 有没有办法在没有 jQuery 的情况下做同样的事情,只使用 CSS3 和 HTML5

javascript - 自定义编辑菜单 Angular Dashboard Framework

javascript - 在backbone.js中使用全局变量..最佳实践

javascript - 如何创建 Json 数组

arrays - 将嵌入空格的文件名读取到 shell 脚本中的数组中

javascript - 如何删除外部阵列?

javascript - 我可以使用相同的代码遍历 immutable.List、immutable.Set 或 Javascript Array 或 Set 吗?