使用带有2个数组的下划线嵌套子注释

时间:2014-03-03 05:41:11

标签: javascript arrays underscore.js

我正试图找出最有效的方法来做到这一点。我有一个看起来像这样的单个对象:

var comments = [{
    id: 1,
    deleted: 0,
    comment: 'I am the parent commenter',
    created: 'Sun Mar 01 2014 18: 16: 53 GMT - 0800(PST)',
    parent_id: null,
    username: 'edmund'
}, {
    id: 2,
    deleted: 0,
    comment: 'I am a reply',
    created: 'Sun Mar 02 2014 18: 16: 59 GMT - 0800(PST)',
    parent_id: 1,
    username: 'sally'
}, {
    id: 3,
    deleted: 0,
    comment: 'I'm also a reply',
    created: 'Sun Mar 03 2014 18: 16: 59 GMT - 0800(PST)',
    parent_id: 1,
    username: 'susan'
}];

它包含注释,如果注释具有非空parent_id,那么它就是一个孩子。所以我将它们分成2个数组,如下所示:

var parents = [], children = [];

_(comments).filter(function(comment) {
    comment.parent_id === null ? parents.push(comment) : children.push(comment);
});

现在,将所有孩子附加到特定家长评论的最佳方式是什么?我在想这样的事情:

children.forEach(function(child) {
  parents[child['parent_id']]['children'] = _.where(children, { parent_id : child.parent_id });
});

有没有办法可以将所有这些

组合在一起

2 个答案:

答案 0 :(得分:3)

您可以使用_.groupBy,就像这样

console.log(_.groupBy(comments, "parent_id"));

这给了

{ '1': 
   [ { id: 2,
       deleted: 0,
       comment: 'I am a reply',
       created: 'Sun Mar 02 2014 18: 16: 59 GMT - 0800(PST)',
       parent_id: 1,
       username: 'sally' },
     { id: 3,
       deleted: 0,
       comment: 'I\'m also a reply',
       created: 'Sun Mar 03 2014 18: 16: 59 GMT - 0800(PST)',
       parent_id: 1,
       username: 'susan' } ],
  null: 
   [ { id: 1,
       deleted: 0,
       comment: 'I am the parent commenter',
       created: 'Sun Mar 01 2014 18: 16: 53 GMT - 0800(PST)',
       parent_id: null,
       username: 'edmund' } ] }

现在,如果密钥为null,则它们都是父项,所有其他元素都是parent_id s

var _ = require("underscore");
var groupedData = _.groupBy(comments, "parent_id");
var parents = groupedData["null"], children = _.omit(groupedData, "null");
console.log("Children:", children);
console.log("Parents:", parents);

<强>输出

Children: { '1': 
   [ { id: 2,
       deleted: 0,
       comment: 'I am a reply',
       created: 'Sun Mar 02 2014 18: 16: 59 GMT - 0800(PST)',
       parent_id: 1,
       username: 'sally' },
     { id: 3,
       deleted: 0,
       comment: 'I\'m also a reply',
       created: 'Sun Mar 03 2014 18: 16: 59 GMT - 0800(PST)',
       parent_id: 1,
       username: 'susan' } ] }

Parents: [ { id: 1,
    deleted: 0,
    comment: 'I am the parent commenter',
    created: 'Sun Mar 01 2014 18: 16: 53 GMT - 0800(PST)',
    parent_id: null,
    username: 'edmund' } ]

要获取expected result,您可以使用此

var _ = require("underscore");
var groupedData = _.groupBy(comments, "parent_id");
console.log(_.map(groupedData["null"], function(currentItem) {
    return _.defaults(currentItem, {"children": groupedData[currentItem.id]});
}));

<强>输出

[ { id: 1,
    deleted: 0,
    comment: 'I am the parent commenter',
    created: 'Sun Mar 01 2014 18: 16: 53 GMT - 0800(PST)',
    parent_id: null,
    username: 'edmund',
    children: 
     [ { id: 2,
         deleted: 0,
         comment: 'I am a reply',
         created: 'Sun Mar 02 2014 18: 16: 59 GMT - 0800(PST)',
         parent_id: 1,
         username: 'sally' },
       { id: 3,
         deleted: 0,
         comment: 'I\'m also a reply',
         created: 'Sun Mar 03 2014 18: 16: 59 GMT - 0800(PST)',
         parent_id: 1,
         username: 'susan' } ] } ]

答案 1 :(得分:0)

如果你需要构建一个树 - 合并嵌套的子元素,如1&gt; 1.1&gt; 1.1.1您可以使用此递归:

var raw = [
    { title : 'element_1', id : 1 },
    { title : 'element_2' , id : 2 },
    { title : 'element_3' , id : 3 },
    { title : 'element_11', id : 11, parent_id : 1 },
    { title : 'element_12' , id : 12, parent_id : 1 },
    { title : 'element_21', id : 21, parent_id : 2 },
    { title : 'element_22' , id : 22, parent_id : 2 },
    { title : 'element_31', id : 31, parent_id : 3 },
    { title : 'element_32' , id : 32, parent_id : 3 },
    { title : 'element_331', id : 331, parent_id : 33 },
    { title : 'element_332' , id : 332, parent_id : 33 },
    { title : 'element_111', id : 111, parent_id : 11 },
    { title : 'element_113' , id : 113, parent_id : 11 }
],

roots = {},
childs = {};

function tree(item) {
    for (c in childs[item.id]){
        var el = childs[item.id][c];

        item.nodes = item.nodes || [];
        item.nodes.push(el);

        childs[el.id] && tree(el);
    }
}

for (item in raw){
    if(!raw[item].parent_id){
        roots[item] = raw[item];
    } else { 
        var p_id = raw[item].parent_id;

        childs[p_id] = childs[p_id] || [];
        childs[p_id].push(raw[item])
    }
}

for (i in roots){
    tree(roots[i])
}

console.log(roots);