javascript - Javascript Buildorder 的问题
问题描述
我最近遇到了这个问题,并试图解决这个问题。
问题:
- 实现 getBuildOrder 以返回可以按顺序构建的包名称数组,这样在构建其依赖项之前不会构建任何包。(就像package.json一样)
- 你的方法是什么?
- 您应该考虑哪些关键的边缘情况?(循环依赖)
- 你打算如何在你的方法中检测循环依赖?
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);
}
但是,我不认为我走在正确的道路上。我想了解实现这样的事情的正确方法(使用递归)。
在这种情况下,我们如何检测周期?
解决方案
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))
推荐阅读
- sql - 没有 ROW_NUMBER() 的 SQL 编号行与 Partition By ?玛丽亚数据库 10.1
- amazon-web-services - 最近上传的 AWS S3 文件未更新
- python - 如何根据列中逗号分隔值的数量复制行
- laravel - Laravel 查询生成器如何忽略某些列
- android - 扑动 DraggableScrollableSheet 与粘性标题
- ssis - SSIS Postgres odbc 连接管理器问题
- linux - 如何在 bash 对话框清单中设置不可更改的条目?
- c# - 打开下拉菜单时更改 ComboBoxItem 的高度
- javascript - JavaScript 字符串到日期类型转换 DD-MM-YYYY HH:MM:SS
- r - R中的子集时间序列数据