将属性动态分配给JavaScript对象(trie)
我试图在JavaScript中实现a的一个变体。基本上,它是一个有效的数据存储对象,其中键中的字符不会重复。换句话说,如果我有键“abe”和“ann”,那么共享字母“a”只会出现一个实例:将属性动态分配给JavaScript对象(trie),javascript,trie,Javascript,Trie,我试图在JavaScript中实现a的一个变体。基本上,它是一个有效的数据存储对象,其中键中的字符不会重复。换句话说,如果我有键“abe”和“ann”,那么共享字母“a”只会出现一个实例: { a: { b: { e: { 0: 'lincoln' } }, n: { n: { 0: 'mcgee'
{
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”,我需要为根['a']['b']['e']
分配一个属性。当关键点的数量和值未知时,我找不到一种方法将值指定给几层深的对象属性
我认为,我想到的唯一解决方案是一个糟糕的解决方案:将值的路径放入字符串中,然后使用eval
。例如:eval(“root['a']['b']['e']='lincoln'”代码>
是否有更好的动态分配值的解决方案?(我意识到这是一个有点复杂的问题,所以我很乐意通过提供额外的信息来澄清。)一个非常幼稚的方法(考虑到需求,尽管我会编写一个不同的实现)
给定一串键和指向根的指针,以及要分配的值
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;
}
你要找的是一个双数组trie。
您可以对此进行github搜索,但列出的两个主要库是:
- ,从文件中:
var doublearray=require('./doublearray.js')
变量字=[
{k:'a',v:1}
{k:'abc',v:2}
])
var trie=doublearray.builder().build(字)
trie.contain('a');//->真的
trie.lookup('abc');//->2
- 或
这只是读/写操作中的一个循环操作,将树遍历到键中每个字母后面的末尾。如果未找到某个字母,则会在树中为该字母创建一个新分支。
usage : write({},'abc',1) // yields {a:{b:{c:1}}}