JavaScript - 根据依赖树排序

2024-01-07

我必须展示一组相互依赖的图像。例如

 Image A depends on no one
 Image B depends on A
 Image C depends on A and B
 Image D depends on F
 Image E depends on D and C
 Image F depends on no one

我有一个像这样的 JavaScript 对象:

const imageDependencies = {
    A: [],
    B: ['A'],
    C: ['A', 'B'],
    D: ['F'],
    E: ['D', 'C'],
    F: []
}

我需要让所有图像名称按其依赖项排序。此示例的结果可能是以下任何一个:

//   so first yo get the value of A. Once you have it you can get the value of B. Once you have the value of A and B you can get C, and so on

result_1 = [A, B, C, F, D, E] 

// this could be another correct result
result_2 = [A, F, D, B, C, E]

我尝试过使用Array.sort()像这样的函数:

let names = Object.keys(imageDependencies);
names.sort((a,b) => {
    if(imageDependencies [a].includes(b)) return 1
    else return -1
})

但工作不正常。

如何才能做到这一点?


你想要的是拓扑排序

(https://en.wikipedia.org/wiki/Topological_sorting https://en.wikipedia.org/wiki/Topological_sorting).

我用这个例子

https://gist.github.com/shinout/1232505#file-tsort-js-L9 https://gist.github.com/shinout/1232505#file-tsort-js-L9

写于铃木新

https://gist.github.com/shinout https://gist.github.com/shinout

const imageDependencies = {
    A: [],
    B: ['A'],
    C: ['A', 'B'],
    D: ['F'],
    E: ['D', 'C'],
    F: []
}

function tsort(edges) {
    let nodes = {}, sorted = [], visited = {};

    let Node = function (id) {
        this.id = id;
        this.afters = [];
    }

    edges.forEach( (v)=> {
        let from = v[0], to = v[1];
        if (!nodes[from]) nodes[from] = new Node(from);
        if (!nodes[to]) nodes[to] = new Node(to);
        nodes[from].afters.push(to);
    });

    Object.keys(nodes).forEach(function visit(idstr, ancestors) {
        let node = nodes[idstr],id = node.id;

        if (visited[idstr]) return;
        if (!Array.isArray(ancestors)) ancestors = [];

        ancestors.push(id);
        visited[idstr] = true;
        node.afters.forEach(function (afterID) {
            if (ancestors.indexOf(afterID) >= 0)  
                throw new Error('closed chain : ' + afterID + ' is in ' + id);
            visit(afterID.toString(), ancestors.map(function (v) { return v })); 
        });
        sorted.unshift(id);
    });

    return sorted;
}


const createEdges = (dep) => {
    let result = []
    Object.keys(dep).forEach(key => {
        dep[key].forEach(n => {
            result.push([n, key])
        })
    })
    return result
}

const list = createEdges(imageDependencies)
console.log(tsort(list))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaScript - 根据依赖树排序 的相关文章

  • ng-include 跨域帮助 angularjs

    我正在尝试为加载到 ng include 跨域的 url 实现白名单 这是一场噩梦 我有一个在本地运行良好的包含 div div 然后我像这样添加白名单 angular module myApp ngRoute ngResource con
  • Morph 目标为 Three.js

    我正在尝试开始使用变形目标和 Three js 然而 关于这个主题的文档似乎并不多 当我查看源代码时 morphTargetInfluences 似乎是有魔力 这是如何运作的 我该如何使用这个 值为1就是全力吗 如何区分同一模型上的不同变形
  • 无法从角度路由器获取路径或 url

    我无法从 ActivatedRoute 或 Router 导入中获取 URL 或路径 它为路径 输出空白 为 URL 输出 我记得使用的是工作版本 唯一捕获正确路由的是Router events 我也无法订阅ActivatedRoute 中
  • 如何在js中将嵌套的html元素提取到同一级别

    我使用 javascript 并有一个 div 元素 里面有一些 html 标签 如下所示 一些元素是嵌套的 我想将它们保持在同一级别 第一个 html 是这样的 div p some text on here 1 i some itali
  • Reactjs 中的嵌套注释

    我有以下 json comments id 1 comment text asdasdadasdsadsadadsa author adsfasdasdsad post id 1 ancestry null archived false c
  • 通过 Jquery 禁用 TinyMCE 文本编辑器

    我有多个 Tinymce 编辑器 我试图禁用它们的编辑功能 我尝试过多种变体 if Model hasRegular ToString ToLower tinymce get rte getBody setAttribute content
  • Chrome 扩展程序不会从弹出文件加载我的 JavaScript

    我正在为论坛构建 Chrome 扩展程序 但问题是我的 popup html 的 JavaScript 不会执行任何操作 我在顶部添加了警报 popup js running 它确实出现了 但我的弹出窗口根本不显示 这是一个问题 因为弹出页
  • 类型“AngularFirestoreCollection”上不存在属性“onSnapshot”

    我正在尝试将侦听器与云 Firebase 分离 但仍然收到此错误 类型 AngularFirestoreCollection 上不存在属性 onSnapshot 你知道我应该进口什么吗 我直接从 Firebase 文档中复制此代码 let
  • 与 raphael 一起制作路径动画

    我仍在试图弄清楚拉斐尔 并被一些基本的动画所困扰 看看这里 http jsfiddle net d7d3Z http jsfiddle net d7d3Z 这很简单 两条动画到位的路径 但我想要的是它看起来像一条线一样 绘制 而不是一起开始
  • android recycler 视图适配器、viewpagers、数据库、位图和内存不足错误

    hello im loading lots of little images ex 180x180 10 21kb from a LOCAL database into lots of different recycler views in
  • Jquery 验证,在submitHandler() 中单击获取按钮

    我有两个按钮type Submit 验证后 在submitHandler我想知道点击了这些按钮中的哪一个 根据这一点 我想禁用该按钮 Handler add customer validate rules name required tru
  • JavaScript 中什么可能会打乱我的查询字符串参数构造函数?

    所以这可能是一个很长的机会 但我完全不知道可能导致这个问题的原因 我正在提供一个客户端 JavaScript 它解析嵌入的页面上的某些参数 使用这些参数构建 URL 并使用该 URL 将 iframe 注入到页面中 如下所示 var que
  • JavaScript Element.requestFullscreen() 未定义

    如果我如何使用代码element requestFullscreen 是未定义的 if element webkitRequestFullScreen element webkitRequestFullScreen If requestFu
  • javascript - 自动点击 Netflix 互动电影选择

    我正在寻找一种方法 可以自动点击一些 Netflix 电影中的交互选项 我尝试了很多方法 但似乎只有焦点事件有效 document getElementsByClassName BranchingInteractiveScene choic
  • 处理流星中的长服务器端计算

    我正在使用 jimp https www npmjs com package jimp https www npmjs com package jimp 在meteor JS中生成图像服务器端 换句话说 我正在使用递归算法 计算 图像的像素
  • 将 jQuery 集成到电子应用程序中

    我正在尝试将 jquery 功能添加到用 Electron 编写的桌面应用程序中 使用电子快速启动存储库 我将下载的 jquery 文件添加到main html像这样的文件 or so 然后在index js我正在文件中添加代码create
  • 如何在 PHP 中对数组和数据进行排序?

    这个问题旨在作为有关 PHP 中数组排序问题的参考 人们很容易认为您的特定案例是独特的并且值得提出新问题 但大多数实际上只是此页面上的解决方案之一的微小变化 如果您的问题因与此问题重复而被关闭 请仅在您能解释为什么它与以下所有问题显着不同的
  • Javascript:为什么我需要在 for 循环中声明 var i = 0?

    我正在做一个需要递归的问题 用于计算加起来达到一定数量的硬币组合 有效的解决方案如下 困扰我几个小时的一件事是 当我没有在 for 循环中声明 var i 0 时 它不起作用 据我了解 当我在 for 循环中声明 var 时 它会保留在该范
  • 模块模式和这个

    我正在为我的 JavaScript 类 使用模块模式 声明有什么重大缺点吗 var self在课外我返回然后将其设置为this在类构造函数内部 这样当我不希望发生上下文切换时 我就不必担心上下文切换 在这个小例子中 可能没有必要 这只是一个
  • 当父窗口关闭时关闭子窗口(弹出窗口)

    我有一个简单的示例页面 当您单击链接时 我正在使用弹出子弹出窗口进行处理 我一直在尝试各种卸载事件来在父窗口关闭时关闭子窗口 但似乎无法弄清楚我错过了与简单编码相关的内容 弹出窗口工作完美 但是关闭父窗口会使弹出窗口保持打开状态

随机推荐