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

时间:2014-03-27 02:48:49

标签: javascript trie

我正在尝试在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'");

是否有更好的解决方案来动态分配值? (我意识到这是一个复杂的问题,所以我很乐意通过提供额外的信息来澄清。)

2 个答案:

答案 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