使用Javascript推送嵌套数组注释

使用Javascript推送嵌套数组注释,javascript,arrays,comments,push,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... ', pare

我从服务器上得到一个这样的评论数组:

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
推送到
id:3
和id:3&id:4
推送到
id:1`并获得如下数组的最佳方法是:

[{
    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: 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: []
}]

您可以尝试以下方法:

逻辑:
  • 使用父级的最小长度对数组进行排序
  • 然后循环遍历
    .parent
    ,递归地搜索必要的对象。对于多个父节点,将
    searchNode
    设置为前一个父节点的回复
  • 循环结束后,将当前对象推入其中
var comments=[{id:1,文本:“Lorem ipsum door sit amet…”,家长:[]2,文本:“Lorem ipsum door sit amet…”,家长:[]3,文本:“Lorem ipsum door sit amet…”,家长:[1]},{id:4,文本:“Lorem ipsum door sit amet…”,家长:[1]},{id:5,文本:“Lorem ipsum door sit amet…”,家长:[1,3]},{id:6,文本:“Lorem ipsum door sit amet…”,父:[]}];
var r=[];
注释.排序(函数(a,b){
返回a.parent.length-b.parent.length
}).forEach(函数(o){
如果(o.parent.length>0){
var lastNode=注释;
o、 parent.forEach(函数(n){
如果(!Array.isArray(lastNode))lastNode=lastNode.reply
lastNode=lastNode.find(x=>x.id==n)
});
如果(最后一个节点){
lastNode.reply=lastNode.reply | |[];
lastNode.reply.push(o)
}
}否则{
o、 答复=[];
r、 推(o);
}
});

console.log(r)
此方案适用于未排序的数据。它以
id
为参考,即使对于未知的
id
对象,也会将其应用于临时对象,并在以后用给定的数据填充它。这意味着这个解决方案只需要一个循环

var comments=[{id:1,文本:'Lorem ipsum door sit amet…',父项:[]},{id:2,文本:'Lorem ipsum door sit amet…',父项:[1]},{id:4,文本:'Lorem ipsum door sit amet…',父项:[1]},{id:5,文本:'Lorem ipsum door sit amet…',父项:[1,3]},{id:6,文本:'Lorem ipsum door sit amet…',父项:[]},
树=函数(数组){
var r=[],
o=Object.create(空);
array.forEach(函数(a){
变量id;
a、 回复=o[a.id]&&o[a.id];
o[a.id]=a;
id=a.parent.reduce(函数(r,a){
r!==null&&!(o中的a)&&o[r].reply.push(o[a]={});
返回a;
},空);
如果(id!==null){
o[id]。回复=o[id]。回复| |[];
o[id]。回复。推送(a);
}否则{
r、 推(o[a.id]);
}
});
返回r;
}(评论);
console.log(树);

.as控制台包装{最大高度:100%!重要;顶部:0;}
你想得到最后一个,树吗?是的,我想从第一个数组创建最后一个数组。当在chrome上运行这个代码段时,模拟发生了一些事情。它包括
id:5
在reply
id:1
id:3
中,这两个数组应该只包括在chrome的
id:3
方面中。代码包含项在父项中d另一个forefathers@SydAmir,这是一次无动机的推送,请参见编辑。