Javascript 根据子级对数组重新排序

Javascript 根据子级对数组重新排序,javascript,Javascript,我希望得到一个有序数组,以便能够先执行子对象,然后执行所有父对象 以下是一个例子: 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依赖项,首先安装所有子项,然后安装剩余的父项,以避免由于缺少子项安装而出

我希望得到一个有序数组,以便能够先执行子对象,然后执行所有父对象

以下是一个例子:

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依赖项,首先安装所有子项,然后安装剩余的父项,以避免由于缺少子项安装而出现错误

提前感谢您的帮助。

这是我们的电话。下面是Kahn算法的简单实现(参见链接):

var图={
p1:['c1','c2','c3'],
p2:['c4','c5','c6'],
c1:['c2','p2']
};
变量端子={},
排序=[];
Object.keys(图形).forEach(n=>
图[n].forEach(k=>
图中的k?'':端子[k]=1];
终端=对象。键(终端);
while(terminals.length!==0){
var t=terminals.shift();
分类推送(t);
Object.keys(图形).forEach(n=>{
图[n]=图[n]。过滤器(x=>x!=t);
if(图[n]。长度===0){
终端。推(n);
删除图形[n];
}
});
}
console.log(已排序)
这被称为。下面是Kahn算法的简单实现(参见链接):

var图={
p1:['c1','c2','c3'],
p2:['c4','c5','c6'],
c1:['c2','p2']
};
变量端子={},
排序=[];
Object.keys(图形).forEach(n=>
图[n].forEach(k=>
图中的k?'':端子[k]=1];
终端=对象。键(终端);
while(terminals.length!==0){
var t=terminals.shift();
分类推送(t);
Object.keys(图形).forEach(n=>{
图[n]=图[n]。过滤器(x=>x!=t);
if(图[n]。长度===0){
终端。推(n);
删除图形[n];
}
});
}

console.log(sorted)
看看排序:看看排序:整洁,所以基本上第一个孩子没有特殊的顺序,因为他们是独立的。这似乎是概念,但当尝试使用
var-graph={p1:['c1',p2',c3',p2:['c4',c5',c6',c1:['p1',p2']},则c1和p1缺失。有什么建议吗?@Alphapage:这里有一个循环依赖关系:
p1->c1->p1
。您无法对循环图进行拓扑排序。整洁,因此基本上第一个子图没有特殊顺序,因为它们是独立的。这似乎是概念,但尝试使用
var-graph={p1:['c1',p2',c3',p2:['c4',c5',c6',c1:['p1',p2']},则c1和p1缺失。有什么建议吗?@Alphapage:这里有一个循环依赖关系:
p1->c1->p1
。不能对循环图形进行拓扑排序。