我希望得到一个有序的数组,以便能够先执行所有父项的子项。
以下是一个例子:
var p1=[c1,c2,c3] // c1,c2,c3 are children
var p2=[c4,c5,c6]
var c1=[c2,p2] // but c1 can depend on parent
所以结果应该是:
var result=[c2,c6,c4,c5,c2,c3,p2,c1,p1]
另一个例子可能是重新排序npm依赖项以先安装所有子项,然后保留父项以避免因为缺少子安装而出错。
提前感谢您的帮助。
答案 0 :(得分:2)
这称为topological sorting。这是Kahn算法的直接实现(参见链接):
var graph = {
p1: ['c1', 'c2', 'c3'],
p2: ['c4', 'c5', 'c6'],
c1: ['c2', 'p2']
};
var terminals = {},
sorted = [];
Object.keys(graph).forEach(n =>
graph[n].forEach(k =>
k in graph ? '' : terminals[k] = 1));
terminals = Object.keys(terminals);
while (terminals.length !== 0) {
var t = terminals.shift();
sorted.push(t);
Object.keys(graph).forEach(n => {
graph[n] = graph[n].filter(x => x != t);
if (graph[n].length === 0) {
terminals.push(n);
delete graph[n];
}
});
}
console.log(sorted)