这个标题太可怕了。
我不确定如何快速描述这个问题。我是自学成才的程序员(业余爱好> 10年,专业&> 3年)所以我没有很多计算机科学知识可以帮助解决这样的问题,这就是为什么我&#39 ; m发布这个。我希望能听到解决这个问题的更好方法。我不需要一个全面的解决方案,但可能有些类型的数据结构或算法可以帮助我。朝着正确的方向发展。
我有根据州建立的网址,例如:
state: 'foo', url: '/foo'
state: 'foo.bar' url: '/bar'
foo
&#39}的网址为/foo
和
bar
的网址为/foo/bar
这有意义吗?它继承了父母的URL。
此外,bar
是foo
的孩子,州可以拥有无限数量的子女:foo.bar
,foo.zar
,foo.far
,{{1和孩子可以有孩子,etc.
,foo.bar.alpha
,foo.bar.beta
。这没有严格的最大深度。
因此,URL制作是一件容易的事,已经完成了。我试图反过来。
如果我有网址etc
,我如何查找创建此网址的状态?
问题在于,州的网址可以随心所欲,并且不必独立开始,例如:
/foo/bar
我提出的一个解决方案是创建一个包含所有创建的URL的查找表,这些URL指向创建它们的状态。创造它并不可怕,但看起来并不聪明,感觉非常强大。
我的第二个解决方案是将要分析的网址拆分为块,用斜线state: 'zar', url: '/one/two/three'
state: 'far', url: '/one/two/nine'
拆分,然后分析每个" root"通过/
分割该URL,并尽可能多地匹配块,然后选择具有最匹配块的块。我的问题是我最终会走错路:
/
有可能选择state: 'alpha', url: '/alpha'
state: 'alpha.beta', url: '/beta'
state: 'alpha.beta.gamma', url: '/gamma'
state: 'foxtrot', url: '/alpha'
state: 'foxtrot.beta', url: '/beta'
state: 'foxtrot.beta.gamma', url: '/foxy'
> alpha
然后失败,因为没有alpha.beta
状态,正确的根目录是/foxy
。似乎这种方式可能更慢,不得不动态构建URL而不是使用查找。另外,像这样的特定情况确实非常奇怪,但可能会发生。
我感谢任何人甚至可以看一看。如果有人关心,我会在此期间实施一个查找表来解决这个问题,但我对其他解决方案非常好奇。
修改
如果感兴趣,可以使用以下内容:https://jsbin.com/muvuza/4/edit?js,console
答案 0 :(得分:0)
您想要将字符串映射到对象。据我所知,你需要一个查找表来执行任何给定的语言。在JS中,您可以使用字符串直接访问对象的属性,因此该表基本上已经为您完成了。
//javascript
//define some states
var starting_states = [zar, far, alpha, foxtrot];
var url = '/zar/one/two/three/';
var urlPieces = url.split("/");
//Iterate through states, selecting the next hashed object
var state = starting_states[urlPieces[0]];
for(var i=1;i<urlPieces.length;i++){
state = state[ urlPieces[i] ];
}