DFS在Typescript / JavaScript中的对象数组上实现

时间:2017-08-05 06:09:41

标签: javascript arrays typescript dfs

我有一个包含键,值和子代的类

class Container{
    key: string,
    value: string,
    children: Container[]
}

function searchKey(container: Container, key:string){
    if (container.key == key) {
        return container;
    }
    else if (container.children.length>0){
        for (let child of container.children) {
            let found = searchKey(child, key);
            if (found != null) {
                return found;
            }
        }
    }
    return null;
} 

我将提供给searchKey()函数的输入将是一个包含深层对象的数组,我想获得所提供的关键参数的值。但是当前的searchKey()函数不接受数组。如何使用数组作为输入?

1 个答案:

答案 0 :(得分:1)

您的searchKey()函数目前接受一个Container并检查其是否与key匹配。如果失败,它会遍历children ContainerContainer数组,并在每个数组上递归调用。

如果您只打算使用Container数组来调用该函数,并且永远不需要传入单个function searchKey(containers: Container[], key: string): Container | null { if (containers.length > 0) { for (let container of containers) { if (container.key == key) { return container; } else { let found = searchKey(container.children, key); if (found != null) { return found; } } } } return null; } ,那么您可以将函数内外翻像这样:

searchKey()

(我试着保持上述功能与原作相同。)

这个Container函数以迭代Container的数组开始。它会检查每个key是否有children匹配,如果找不到,则会在Container | Container[]数组上递归调用。

当然,还有其他方法可以做到这一点。示例:

  • 两个相互递归的函数;
  • 一个接受searchKey()个参数的双重用途函数;
  • 一个简单的垫片,用现有的Container调用虚拟children对象,其<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> 是您想要的数组。

哪一个最好取决于您的使用案例。

希望有所帮助;祝你好运。