首页 > 解决方案 > 循环以递归方式抛出数组数组(算法问题)

问题描述

我有点想创建一个在工厂中最常见的功能。一种轮换系统,人们交换他们的位置,而其他人则在休息。

通过 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 外,“新职位”上也没有重复项。(无论如何这是首发

标签: javascriptrecursionmultidimensional-array

解决方案


您可以采用顺序方法并按顺序访问所有节点,您有。然后为最顶层的项目获取一个嵌套属性并保持与节点的关系。最后只返回顶部节点。

如有必要,获取键/值对数组的结果条目。

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; }


推荐阅读