我正在尝试在JavaScript中实现trie的变体。基本上,它是一个有效的数据存储对象,其中键中的字符不会重复。换句话说,如果我有“abe”和“ann”键,则只应出现共享字母“a”的一个实例:
{
a: {
b: {
e: {
0: 'lincoln'
}
},
n: {
n: {
0: 'mcgee'
}
}
}
}
以下是所需的实现和一些使用示例:
function Trie () {
// The top level of the trie.
var root = {};
return {
write: function (key, value) {
},
read: function (key) {
}
};
}
// Sample usage
var trie = new Trie();
trie.write('abe', 'lincoln');
trie.write('ann', 'mcgee');
trie.read('abe'); // returns 'lincoln'
trie.read('ann'); // returns 'mcgee'
我遇到了write
方法的阻止程序。给定一个字符串键,例如“abe”,我需要为root['a']['b']['e']
分配一个属性。当键的数量和键的值未知时,我无法找到一种方法将值分配给多个深层的对象属性。
我想,唯一想到的解决方案是一个糟糕的解决方案:将值的路径放入字符串并使用eval
。例如:eval("root['a']['b']['e'] = 'lincoln'");
是否有更好的解决方案来动态分配值? (我意识到这是一个复杂的问题,所以我很乐意通过提供额外的信息来澄清。)
答案 0 :(得分:1)
一种非常天真的方法(考虑到要求,但我会写一个不同的实现)
给出一串键和指向根的指针,以及要指定的值;
function write(root,path,value){
var a = path.split(''); // 'abc'->['a','b','c']
var pointer = root;
var i=0;
while(i<a.length-1){
if(pointer[a[i]] == undefined){
pointer[a[i]]={};
}
pointer = pointer[a[i]];
i++;
}
pointer[a[i]]=value;
return root;
}
编辑:我假设他们各自的对象上存在所有密钥。我添加了一个if条件,以防某些键未定义。
编辑:2分裂纠正,现在纠正一个小错误;)
编辑:3现在应该工作。
usage : write({},'abc',1) // yields {a:{b:{c:1}}}
答案 1 :(得分:0)
你正在寻找的是一个双阵列特里。 您可以对github进行搜索,但列出的两个主要库是:
var doublearray = require('./ doublearray.js');
var words = [
{k:'a',v:1},
{k:'abc',v:2},
];
var trie = doublearray.builder()。build(words);
trie.contain( 'A'); // - &gt;真
<强> trie.lookup( 'ABC'); // - &gt; 2 强>