我试着遍历一个数字数组,并计算每个数字在数组中被找到的次数。
在ruby中,这很简单,我只需要声明一个Hash.new(0)
,并且已经设置了从0开始计数的哈希值。例如:
arr = [1,0,0,0,1,0,0,1]
counter = Hash.new(0)
arr.each { |num| counter[num] += 1 } # which gives {1=> 3, 0=> 5}
字符串
我想在JavaScript中做同样的事情,但let counter = {}
给了我{ '0': NaN, '1': NaN }
。
你知道如何在JavaScript中创建与Object相同的Hash吗?
3条答案
按热度按时间bt1cpqcv1#
ECMAScript不像Ruby对
Hash
es那样为对象中缺少的键设置默认值。然而,你可以使用 * 动态内省元编程 * 来做类似的事情,使用ECMAScriptProxy
对象:字符串
所以,你可以这样做:
型
然而,这仍然不等同于Ruby版本,其中the keys of the
Hash
can be arbitrary objects,而ECMAScript对象中的属性键只能是String
s和Symbol
s。Ruby
Hash
的直接等价物是ECMAScriptMap
。不幸的是,ECMAScript
Map
s也没有默认值。我们可以使用与对象相同的技巧来创建Proxy
,但这会很尴尬,因为我们必须拦截对Map
的get
方法的访问,然后提取参数,调用has
,等等。幸运的是,
Map
被设计为可子类化:型
这允许我们做这样的事情:
型
当然,一旦我们开始定义自己的
Map
,我们可能会一直这样做:型
这也证明了一个非常重要的教训:数据结构的选择可以极大地影响算法的复杂性。通过正确选择数据结构(a
Histogram
),算法 * 完全消失 *,我们所做的就是示例化数据结构。请注意,在Ruby中也是如此。By choosing the right data structure (there are several implementations of a
MultiSet
floating around the web), your entire algorithm vanishes and all that is left is:型
t8e9dugd2#
在JavaScript中,你可以用
Array.reduce
来实现字符串
kd3sttzy3#
你可以使用
Map
,hash
初始化为Map
hash
中,则将其值增加1
,否则将其设置为1
字符串