javascript - 循环以递归方式抛出数组数组(算法问题)
问题描述
我有点想创建一个在工厂中最常见的功能。一种轮换系统,人们交换他们的位置,而其他人则在休息。
通过 DragnDrop 我创建/添加/更新地图并将此地图转换为数组数组,如下所示:
let example1 = [
['John', ['99', '1']],
['Jo', ["1", "3"]],
["Alpha", ["99", "4"]],
["Beta", ["3", "2"]],
["Gamma", ["2", "99"]],
["Delta", ["4", "5"]],
["Maria", ["5", "6"]],
["Epsilon", ["6", "99"]],
];
第一个数字是旧职位,第二个数字是新职位。数字 99 代表蜜蜂休息。上述示例的输出应类似于:
outputExample1 = [
["John", "1", "3", "2"],
["Alpha", "4, "5", "6"]
]
所以每个序列和递归都应该以一个breaker(=number 99)开始,并以一个breaker结束。在上面的例子中:在第一站放置“john”之后,它应该“搜索”来自第一站的男人/女士是“现在”的位置。在这个例子中,他在 3。现在再次搜索来自他汀 3 的那个现在在哪里。(=2) ... 直到数字为 99,本例中就是这种情况。这就是为什么我开始在'activ'(<99)和'breakers'(==99)中过滤原始数组的原因。我尝试了很多方法并且不断失败(while循环以无限循环结束,输出完全错误),因为我没有找到一个很好的递归。
任何提示都非常珍贵
PS:请考虑上述数组已“完成”以提供一个很好的示例,并且可能无法即时完成(通过拖放)。含义:如果我开始拖动,序列肯定没有完成。
编辑:肯定会有至少一个'99'。如果不是没有序列,也没有输出。除 99er 外,“新职位”上也没有重复项。(无论如何这是首发
解决方案
您可以采用顺序方法并按顺序访问所有节点,您有。然后为最顶层的项目获取一个嵌套属性并保持与节点的关系。最后只返回顶部节点。
如有必要,获取键/值对数组的结果条目。
const
data = [['John', ['99', '1']], ['Jo', ["1", "3"]], ["Alpha", ["99", "4"]], ["Beta", ["3", "2"]], ["Gamma", ["2", "99"]], ["Delta", ["4", "5"]], ["Maria", ["5", "6"]], ["Epsilon", ["6", "99"]]],
relations = data
.reduce((r, [top, [from, to]]) => {
if (to === '99') return r;
if (from === '99') {
r[to] = r.top[top] = [to];
} else {
r[from].push(to);
r[to] = r[from];
}
return r;
}, { top: {} })
.top;
console.log(relations);
.as-console-wrapper { max-height: 100% !important; top: 0; }
不带reduce
.
const
data = [['John', ['99', '1']], ['Jo', ["1", "3"]], ["Alpha", ["99", "4"]], ["Beta", ["3", "2"]], ["Gamma", ["2", "99"]], ["Delta", ["4", "5"]], ["Maria", ["5", "6"]], ["Epsilon", ["6", "99"]]],
temp = {},
relations = {};
for (const [top, [from, to]] of data) {
if (to === '99') continue;
if (from === '99') {
temp[to] = relations[top] = [to];
} else {
temp[from].push(to);
temp[to] = temp[from];
}
}
console.log(relations);
.as-console-wrapper { max-height: 100% !important; top: 0; }
推荐阅读
- xcode - Xcode Dual git repos
- macos - 在 MacOSX 上的 x86 程序集 GNU 中处理寄存器整数值环绕
- mysql - pt-archiver 挂在最后剩余的行上
- cordova-plugins - 三星奥赛吐司版本无法在电视上打开(2011 年)
- vue.js - Vuetifyjs DataTable 在组件初始化期间触发 2 个额外的 http 请求
- amazon-web-services - AWS CloudWatch 仪表板:如何显示 EC2 实例名称
- java - 如何从android中的存储中读取文件?
- python - Python子进程管道块
- node.js - 如何将 React 应用程序部署到 Prod 以及如何管理版本控制
- c++ - 在 C++ 中将结构写入文本文件