首页 > 解决方案 > Javascript Buildorder 的问题

问题描述

我最近遇到了这个问题,并试图解决这个问题。

问题:

  1. 实现 getBuildOrder 以返回可以按顺序构建的包名称数组,这样在构建其依赖项之前不会构建任何包。(就像package.json一样)
  2. 你的方法是什么?
  3. 您应该考虑哪些关键的边缘情况?(循环依赖)
  4. 你打算如何在你的方法中检测循环依赖?

const example = [
    {
        name: "cat",
        dependencies: {
            dog: "latest",
            horse: "latest"
        }
    },
    {
        name: "dog",
        dependencies: {}
    },
    {
        name: "horse",
        dependencies: {
            bird: "latest"
        }
    },
    {
        name: "bird",
        dependencies: {}
    },
    {
        name: "bear",
        dependencies: {
            "horse": "latest"
        }
    }
];

function getBuildOrder(packages) { // Code goes here };

这是我的解决方案(方法):

function getBuildOrder(packages) {
    const result = new Set();
    const remaining = [];

    packages.forEach(each => {
        const { name, dependencies } = each;
        if(Object.keys(dependencies).length === 0) result.add(name);
        else remaining.push(each);
    });

    remaining.forEach(each => {
        Object.keys(each.dependencies).forEach(key => result.add(key));
        result.add(each.name);
    });

    return Array.from(result);
}

但是,我不认为我走在正确的道路上。我想了解实现这样的事情的正确方法(使用递归)。

在这种情况下,我们如何检测周期?

标签: javascript

解决方案


const example=[{name:"cat",dependencies:{dog:"latest",horse:"latest"}},{name:"dog",dependencies:{}},{name:"horse",dependencies:{bird:"latest"}},{name:"bird",dependencies:{}},{name:"bear",dependencies:{horse:"latest"}}]

function getBuildOrder(packages) { 
    let ordrd = packages.sort((a,b) => Object.keys(b.dependencies).includes(a.name) ? -1 : 1)
    return ordrd.map(obj => obj.name)
}

console.log(getBuildOrder(example))


推荐阅读