【问题标题】:Dynamically assigning properties to a JavaScript object (trie)将属性动态分配给 JavaScript 对象 (trie)
【发布时间】:2023-03-29 02:14:01
【问题描述】:

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

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

【问题讨论】:

  • 这只是读/写中的一个循环操作,用于在键中的每个字母之后将树遍历到末尾。如果未找到字母,则为该字母在树中创建一个新分支。

标签: javascript trie


【解决方案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 条件以防某些键未定义。

EDIT:2 拆分更正,现在更正一个小错误 ;)

EDIT:3 现在应该可以工作了。

usage : write({},'abc',1) // yields {a:{b:{c:1}}}

【讨论】:

    【解决方案2】:

    您正在寻找的是一个双数组特里。 您可以在 github 上进行搜索,但列出的两个主要库是:

    var doublearray = require('./doublearray.js');

    var 单词 = [

    { k: 'a', v: 1 },

    { k: 'abc', v: 2 },

    ];

    var trie = doublearray.builder().build(words);

    trie.contain('a'); // -> 是的

    trie.lookup('abc'); // -> 2

    【讨论】:

      猜你喜欢
      • 2019-03-20
      • 2017-12-04
      • 2012-10-18
      • 1970-01-01
      • 2016-03-09
      • 2016-01-15
      • 2014-04-05
      • 2014-01-16
      相关资源
      最近更新 更多