JavaScript 中的通用二维哈希?

Generic 2D hash in JavaScript?

在其他语言中,可以创建通用的二维哈希。我知道在 javascript 中也可以创建 2d 哈希 as explained here,但我似乎找不到实现此目的的通用方法。

作为我正在寻找的示例。在 Ruby 你可以这样做:

2dhash = Hash.new{|h, k| h[k] = Hash.new }

puts 2dhash["test"]["yes"]
#=> nil
2dhash[1][2] = "hello"
puts 2dhash[1][2]
#=> "hello"

注意我还没有初始化第二级哈希,它是自动发生的。

是否有可能以某种方式在 javascript 中实现相同的目标?具体来说,一种无需初始化第一级哈希(或对其进行硬编码以使其更具体)即可生成二维哈希的方法。 2dhash是动态使用的,不知道第一层是什么

如果你用对象初始化哈希的第一层,那么你可以引用第二层而不会出现类型错误,即使之前没有定义数据。

示例:

var _2dhash = {a: {}, b: {}, c:{}} 
//Note you cannot start variable names with numbers in js
_2dhash['a']['missingElement'];
// > undefined

之所以有效,是因为您正在访问已定义对象的未定义属性。如果您尝试通过缺少的顶级对象进行访问,即。

_2dhash['d']['whatever'];

你会得到一个TypeError,因为_2dhash.d没有定义,第二次查找失败,试图读取undefined的'whatever' 属性。

看起来像一个很好的数据结构练习,让我试试:D

function Hash() {
  this.hash = {};
}

Hash.prototype.set = function(val) {
  var paths = Array.prototype.slice.call(arguments, 1) // all levels
  var path = paths.shift() // first level
  var hashed = this.hash[path]

  if (paths.length) {
    // still have deeper levels
    if (!(hashed instanceof Hash)) {
      hashed = this.hash[path] = new Hash()
    }
    Hash.prototype.set.apply(hashed, [val].concat(paths))
  } else {
    // last level
    this.hash[path] = val
  }
}

Hash.prototype.get = function() {
  var paths = Array.prototype.slice.call(arguments, 0) // all levels
  var path = paths.shift() // first level
  var hashed = this.hash[path]

  if (paths.length) {
    // still have deeper levels
    return Hash.prototype.get.apply(hashed, paths)
  } else {
    // last level
    return hashed
  }
}

现在,让我们看看它是否有效:

var trytry = new Hash()
trytry.set('the value to store', 'key1', 'key2')

trytry.get('key1')         // Hash{key2: 'the value to store'}
trytry.get('key1', 'key2') // 'the value to store'

太棒了!

它也适用于更深的层次:

trytry.set('the value to store', 'key1', 'key2','key3', 'key4')
trytry.get('key1', 'key2','key3') // Hash{key4: 'the value to store'}

但是,这种方法的缺点是您必须使用实例方法 getset,而不是本机对象文字 getter/setter.

还未完成。对于生产环境,我们需要做更多,例如containssize 等方法和属性