根据孩子重新排序数组

时间:2016-05-25 12:13:45

标签: 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依赖项以先安装所有子项,然后保留父项以避免因为缺少子安装而出错。

提前感谢您的帮助。

1 个答案:

答案 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)