【问题标题】:Javascript: possible to dynamically create a multidimensional array?Javascript:可以动态创建多维数组吗?
【发布时间】:2013-11-14 00:59:51
【问题描述】:

我正在玩 Javascript 中的多维数组。 基本上,我正在尝试使用多维数组将字符串的字母放入某种 Trie(实际上是基数树)中。

  var data= [];
  var word="test";

  if (l=word[0]) {
      if (!data[l]) {
          data[l] = [];
      }
  }
  if (l=word[1]) {
      if (!data[word[0]][l]) {
          data[word[0]][l] = [];
      }
  }
  if (l=word[2]) {
      if (!data[word[0]][word[1]][l]) {
          data[word[0]][word[1]][l] = [];
      }
  }
  if (l=word[3]) {
      if (!data[word[0]][word[1]][word[2]][l]) {
          data[word[0]][word[1]][word[2]][l] = [];
      }
  }

  console.log(data);

见小提琴:http://jsfiddle.net/TN28c/

我想知道这是否可以自动化(不使用eval())来处理任意长度的单词。我知道 Javascript 没有指针/引用,这可能是我在 PHP 中使用的,但是否有其他方法?

我不是在寻找 trie 库,我已经找到了其中的一些,但我只是想知道是否可以在 Javascript 中动态执行上述操作。

【问题讨论】:

  • 一切在 JavaScript 中都是动态的。为什么不可能?您在发布的代码中没有看到for 循环模式吗? (对不起,如果这看起来很苛刻;我不是故意的。)
  • 一个离题的技术说明:PHP 也没有指针。它有references,表面上相似,但有一些重要的区别。
  • 字符串test 的预期输出是什么?您生成的格式错误的数组对我来说似乎奇怪
  • 对于 OP,wikipedia page for trie 的算法看起来很容易转换为 JS。
  • @Dylan 你需要两个循环。外层将通过单词进行,然后在每个级别您都必须通过数组。可能做一个递归版本会容易得多。

标签: javascript multidimensional-array trie


【解决方案1】:
var word= 'tree';
var data = [];
var obj = data;
for (var i = 0; i < word.length; i++) {
    if (!obj[word[i]]) {
        obj[word[i]] = []
    }
    obj = obj[word[i]];
}
console.log(data);

【讨论】:

  • 我喜欢这种简单的方式,但我不明白。 obj 永远不会被复制回数据,但数据确实包含最后一行中的多维数组......这怎么可能?
  • 其实objdata只是开头对同一个对象的不同引用。它不需要复制回来。 obj 通过迭代改变,只是指向data 的子对象。
【解决方案2】:

这里以一个简单的递归版本为例。当然,您也可以反复进行。

function trieAdd(trie, word) {
  function addWorker(trie, position) {
    var l = trie[word[position]];
    if (!l)
      trie[word[position]] = l = [];

    if (position < word.length - 1)
      addWorker(l, position + 1);
  }

  addWorker(trie, 0);
  return trie;
}

trieAdd([], "test");

【讨论】:

  • @RainingChain 没有 suitable programing font 不是。
  • @RainingChain ??为什么? “l”有什么问题?这是一封很好的信。 “爱”以“l”开头!! “棒棒糖”也是如此。还有“甘草”。还有“lorakeet”。
  • @Pointy 您的回复实际上在备份 my 回复方面做得很好。
  • @Mathletics 哦,谢谢 - 我在我的 Firebug 控制台中修复了这个问题,但忘了在答案中!
猜你喜欢
  • 1970-01-01
  • 2011-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
  • 2014-08-14
  • 2017-12-10
相关资源
最近更新 更多