所以我有这个数据结构来自CouchDB。
[
{
id: '1',
type: 'bot',
},
{
id: '2',
type: 'conversation',
owner: '1', // bot id 1
},
{
id: '3',
type: 'message',
owner: '2', // conversation id 2
},
{
id: '4',
type: 'message',
owner: '2', // conversation id 2
},
{
id: '5',
type: 'conversation',
owner: '1', // bot id 1
},
{
id: '6',
type: 'bot',
},
{
id: '7',
type: 'conversation',
owner: '6', // bot id 6
},
{...}
]
我试图获取一个启动潜在父母的ID列表。父ID可以是会话ID(拥有消息),也可以是机器人ID(拥有会话和消息)。
所以基于上面的数据,如果我提供id 1
(在这种情况下是机器人),预期结果将是[2, 3, 4, 5]
。
我试图用vanilla JS完成这项工作。由于浏览器缺乏尾调用优化,我避免了递归。
谢谢!
答案 0 :(得分:0)
您可以使用两遍方法(稍后使用递归)。首先收集并将所有孩子分配给他们的父母,然后让所有孩子。
function getChildren(array, id) {
function iter(id) {
result.push(id);
(children[id] || []).forEach(iter);
}
var children = Object.create(null),
result = [];
array.forEach(function (o) {
if ('owner' in o) {
children[o.owner] = children[o.owner] || [];
children[o.owner].push(o.id);
}
}),
iter(id);
return result.slice(1); // without starting id
}
var data = [{ id: '1', type: 'bot' }, { id: '2', type: 'conversation', owner: '1' }, { id: '3', type: 'message', owner: '2' }, { id: '4', type: 'message', owner: '2' }, { id: '5', type: 'conversation', owner: '1' }, { id: '6', type: 'bot' }, { id: '7', type: 'conversation', owner: '6' }];
console.log(getChildren(data, '1'));