热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

javascript–由嵌套依赖数组元素组数组

我有一个数组存储任务信息.每个任务还​​有一个依赖于它的taskId数组.输入letinputArr[{id:1,dependOnTasks:[2,3]},{id:2,depend

我有一个数组存储任务信息.每个任务还​​有一个依赖于它的taskId数组.

输入

let inputArr = [
{
id: 1,
dependOnTasks: [2, 3]
},
{
id: 2,
dependOnTasks: [3]
},
{
id: 3,
dependOnTasks: []
},
{
id: 4,
dependOnTasks: [5]
},
{
id: 5,
dependOnTasks: []
},
{
id: 6,
dependOnTasks: [5]
}
]

预期输出将所有依赖任务分组到一个阵列中以显示到UI上.

产量

[
[
{
id: 1,
dependOnTasks: [2, 3]
},
{
id: 2,
dependOnTasks: [3]
},
{
id: 3,
dependOnTasks: []
}
],
[
{
id: 4,
dependOnTasks: [5]
},
{
id: 5,
dependOnTasks: []
},
{
id: 6,
dependOnTasks: [5]
}
]
]

我已经做了一个功能,但似乎我通过硬编码思考错了.希望有人可以帮助我使用纯Javascript / TypeScript或Underscore以正确的方式存档,因为我们已经在项目中使用过.

注意:TaskId将是随机字符串,如“5878465507b36e1f9c4c46fe”

解决方法:

// will contain the groups (results).
var result = [];
// will serve as a holder of the already treated indexes of inputArr.
var indexCache = [];
// insert obj into a group, insert its dependencies and the object that depend on it as well.
function insertWithDependencies(obj, group){
// insert this obj into this group
group.push(obj);
// First: look for the objects it depends on
obj.dependOnTasks.forEach(function(id){
for(var i = 0; i // if the object in this index is already treated, then ignore it
if(indexCache.indexOf(i) != -1) continue;
// if this object is a dependency of obj then insert it with its own dependencies.
if(inputArr[i].id == id){
var o = inputArr[i];
indexCache.push(i); // cache this i as well
insertWithDependencies(o, group);
}
}
});
// Then: look for the objects that depends on it
for(var i = 0; i // if the object in this index is already treated, then ignore it
if(indexCache.indexOf(i) != -1) continue;
// if this object depends on obj then insert it with ...
if(inputArr[i].dependOnTasks.indexOf(obj.id) != -1){
var o = inputArr[i];
indexCache.push(i); // cache i
insertWithDependencies(o, group);
}
}
};
// while there is element in the inputArr that haven't been treated yet
while(inputArr.length != indexCache.length){
// the group that will hold the depending tasks all together
var group = [];
// look for the first untreated object in inputArr
var i;
for(i = 0; i if(indexCache.indexOf(i) == -1)
break;
var obj = inputArr[i];
// cache its index
indexCache.push(i)
// insert it along its dependencies
insertWithDependencies(obj, group);
// push the group into the result array
result.push(group);
}

其他方式:

这是一种优化的方法,但之后inputArr中的数据将丢失.它不会使用indexCache来查看索引是否已被处理,而是在inputArr中使所有处理的项都为null.因此,如果您之后不关心或不使用inputArr,请改用:

var result = [];
function insertWithDependencies(obj, group){
group.push(obj);
obj.dependOnTasks.forEach(function(id){
for(var i = 0; i if(!inputArr[i]) continue;
if(inputArr[i].id == id){
var o = inputArr[i];
inputArr[i] = null;
insertWithDependencies(o, group);
}
}
});
for(var i = 0; i if(!inputArr[i]) continue;
if(inputArr[i].dependOnTasks.indexOf(obj.id) != -1){
var o = inputArr[i];
inputArr[i] = null;
insertWithDependencies(o, group);
}
}
};
function findNotNull(){
for(var i = 0; i if(inputArr[i]) return i;
return -1;
}
var index;
while((index = findNotNull()) != -1){
var group = [];
var obj = inputArr[index];
inputArr[index] = null;
insertWithDependencies(obj, group);
result.push(group);
}
console.log(result);


推荐阅读
  • 援用范例援用范例的值(对象)是援用范例的一个实例。建立新对象:new操纵符后跟一个组织函数varpersonnewObject();上面:援用范例:Object组织函数:Objec ... [详细]
  • 從源碼看Promise觀點與完成Promise是JS異步編程中的主要觀點,它較好地處置懲罰了異步使命中回調嵌套的題目。在沒有引入新的言語機制的前提下,這是怎樣完成的呢?上手Prom ... [详细]
  • 模样如下:Array.prototype.delrepfunction(fun){if(!fun){funfunction(d){returnd;};}varnewArr[];th ... [详细]
  • lambda表达式是Java8支持的新特性之一。通过lambda表达式,Java具备了函数式编程的能力。相对于Haskell、Erlang等语言Java的函数式支持仍然较为薄弱,但 ... [详细]
  • 绑定完成的汗青绑定的基础是propertyChange事宜。怎样得知viewModel成员值的转变一直是开辟MVVM框架的主要题目。主流框架的处置惩罚有一下三大类:别的开辟一套AP ... [详细]
  • *代码复用**一、避免**模式1:默认模式*functionParent(){this.name123;}Parent.prototype.sayfun ... [详细]
  • 前面介绍过一种非顺序数据结构是散列表,本文将详细介绍另一种非顺序数据结构——树,它对于存储需要快速查找的数据非常有用二叉树、满二叉树、完全二叉树、堆、 ... [详细]
  • <!DOCTYPEhtml><html> ... [详细]
  • 数据过滤器使用法则相信很多企业版用户已经发现编辑器出现了一个新功能「数据过滤器」,然而打开这个功能之后,又不知道怎么用。今天我们就来简单入门一下这个新功 ... [详细]
  • 看这篇之前,如果没有看过之前的文章,移步拉到文章末尾查看之前的文章。回顾先捋一下,之前我们实现的Vue类,主要有一下的功能:属性和方法的代理proxy监听属性watcher事件对于 ... [详细]
  • javascript中Function类型详解_javascript技巧:Function类型function类型,毋庸置疑是js中相当重要的一个玩意。1.这玩意首先是一个对象,也 ... [详细]
  • Springboot整合dubbo搭建基本的消费、提供和负载均衡
    文章目录1.确定接口2.创建提供者2.1pom配置2.2dubbo配置文件2.3application.properties2.4mybatis相关2.4.1配置UserMappe ... [详细]
  • 转自:https:blog.csdn.netzhushiq1234articledetails52204587实现该功能使用到了DirectoryInfo类。Di ... [详细]
  • 由来|准确性_PeeringDB初探
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了PeeringDB初探相关的知识,希望对你有一定的参考价值。做网络相关工作的,可能需要了解PeeringD ... [详细]
  • 解决iView Table组件宽度只变大不变小的问题_vue.js
    这篇文章主要介绍了解决iViewTable组件宽度只变大不变小的问题,具有很好的参考价值,希望对大家有所帮助。一 ... [详细]
author-avatar
要做转播达人
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有