将属性动态分配给JavaScript对象(trie)

将属性动态分配给JavaScript对象(trie),javascript,trie,Javascript,Trie,我试图在JavaScript中实现a的一个变体。基本上,它是一个有效的数据存储对象,其中键中的字符不会重复。换句话说,如果我有键“abe”和“ann”,那么共享字母“a”只会出现一个实例: { a: { b: { e: { 0: 'lincoln' } }, n: { n: { 0: 'mcgee'

我试图在JavaScript中实现a的一个变体。基本上,它是一个有效的数据存储对象,其中键中的字符不会重复。换句话说,如果我有键“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”,我需要为
根['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}}}