我正试图找出最有效的方法来做到这一点。我有一个看起来像这样的单个对象:
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 });
});
有没有办法可以将所有这些
组合在一起答案 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);