javascript - JavaScript 中的通用 2D 哈希?

标签 javascript multidimensional-array hash

在其他语言中,可以创建通用的二维哈希。我知道在 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将被动态使用,所以我不知道第一个级别是什么。

最佳答案

看起来是一个不错的数据结构练习,让我尝试一下: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,而不是 native 对象文字 getter/setter。

它仍然不完整。对于生产环境,我们需要做更多的事情,例如方法和属性,例如 containssize 等。

关于javascript - JavaScript 中的通用 2D 哈希?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29914396/

相关文章:

java - 使用 Java/Guava Optional<T> 类创建和处理对象矩阵

python - 在最后两个维度上应用函数

c - 使用伪随机哈希方法的哈希数组的大小

c# - PDF 签名 - 嵌入单独签名的哈希

Javascript 和 JQuery - 将输入附加到具有相同类的多个 div

javascript - 如何在 javascript 或 jquery 中显示/向下滑动相关单选按钮

javascript - Network.emulateNetworkConditions 在 chrome 59 中不起作用 --headless

javascript - 使用 Google Apps 脚本从数组中获取最后一个值

perl - 用数组引用替换标量哈希值的更简洁的存储方式?

javascript - 我有一个带滚动条的 div。我如何检测是否有人在滚动条上按下鼠标?