在其他语言中,可以创建通用的二维哈希。我知道在 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'}
但是,这种方法的一个缺点是您必须使用实例方法 get
和 set
,而不是 native 对象文字 getter/setter。
它仍然不完整。对于生产环境,我们需要做更多的事情,例如方法和属性,例如 contains
、size
等。
关于javascript - JavaScript 中的通用 2D 哈希?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29914396/