是的,我知道您可以在 JavaScript 中使用常规对象作为关联数组,但我想使用更接近 java Map 实现的东西(HashMap、LinkedHashMap 等)。可以将任何类型的数据用作 key 的东西。 JavaScript 实现中是否有任何好的散列(代码/表)?
最佳答案
在 javascript 中,对象实际上是一种哈希实现。 Java HashMap 有点像假的,所以我挑战您重新考虑您的需求。
直接回答是否定的,我不相信 javascript 中有 Java 的 HashMap 的出色实现。如果存在,它必然是您可能想要或可能不想使用的库的一部分,并且您当然不需要包括一个库只是为了有一个小哈希表。
那么让我们继续写一个,只是为了检查问题。如果你喜欢,你可以使用它。我们将从编写一个构造函数开始,我们将搭载 Array,它是 Object,但有一些有用的方法可以避免这个例子变得过于乏味:
function HashMap () {
var obj = [];
return obj;
}
var myHashMap = HashMap();
我们将添加一些直接来自 Java 世界的方法,但在我们进行时将其转换为 javascript...
function HashMap() {
var obj = [];
obj.size = function () {
return this.length;
};
obj.isEmpty = function () {
return this.length === 0;
};
obj.containsKey = function (key) {
for (var i = 0; i < this.length; i++) {
if (this[i].key === key) {
return i;
}
}
return -1;
};
obj.get = function (key) {
var index = this.containsKey(key);
if (index > -1) {
return this[index].value;
}
};
obj.put = function (key, value) {
if (this.containsKey(key) !== -1) {
return this.get(key);
}
this.push({'key': key, 'value': value});
};
obj.clear = function () {
this = null; // Just kidding...
};
return obj;
}
我们可以继续构建它,但我认为这是错误的方法。归根结底,我们最终还是使用了 javascript 在幕后提供的功能,因为我们只是没有 HashMap 类型。在伪装的过程中,它适合各种额外的工作。
具有讽刺意味的是,使 javascript 成为如此有趣和多样化的语言的其中一个原因是它处理这种摔跤的轻松程度。我们真的可以做任何我们想做的事,这里的快速示例如果不能说明语言的欺骗性,就什么都不做。然而鉴于这种力量,似乎最好不要使用它。
我只是觉得 javascript 想要更轻量。我个人的建议是在尝试实现正确的 Java HashMap 之前重新检查问题。 Javascript 既不想也负担不起。
记住 native 替代方案:
var map = [{}, 'string', 4, {}];
..相比之下,如此快速和简单。
另一方面,我不认为这里有任何一成不变的答案。此实现确实可能是一个完全可以接受的解决方案。如果您觉得可以使用它,我会说试一试。但如果我觉得我们有相当简单和更自然的方法可供我们使用,我就永远不会使用它……我几乎可以肯定我们会这样做。
旁注: 效率与风格有关吗?注意性能影响.. HashMap.put() 中有一个大 O 正盯着我们看... 性能欠佳可能不是问题,而您在您甚至注意到现代浏览器的性能问题之前,您可能需要做一些非常雄心勃勃的事情或拥有大量数据。有趣的是,当你逆着规律工作时,操作往往会变得效率较低,就好像有一种自然的熵在起作用一样。 Javascript 是一种高级语言,当我们遵守它的约定时,它应该提供高效的解决方案,就像 Java 中的 HashMap 将是一个更自然和高性能的选择一样。
关于javascript - 那里有什么好的 JavaScript 散列(代码/表)实现吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/225367/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has
这道题是thisquestion的逆题.给定一个散列,每个键都有一个数组,例如{[:a,:b,:c]=>1,[:a,:b,:d]=>2,[:a,:e]=>3,[:f]=>4,}将其转换为嵌套哈希的最佳方法是什么{:a=>{:b=>{:c=>1,:d=>2},:e=>3,},:f=>4,} 最佳答案 这是一个迭代的解决方案,递归的解决方案留给读者作为练习:defconvert(h={})ret={}h.eachdo|k,v|node=retk[0..-2].each{|x|node[x]||={};node=node[x]}node[
为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返
它不等于主线程的binding,这个toplevel作用域是什么?此作用域与主线程中的binding有何不同?>ruby-e'putsTOPLEVEL_BINDING===binding'false 最佳答案 事实是,TOPLEVEL_BINDING始终引用Binding的预定义全局实例,而Kernel#binding创建的新实例>Binding每次封装当前执行上下文。在顶层,它们都包含相同的绑定(bind),但它们不是同一个对象,您无法使用==或===测试它们的绑定(bind)相等性。putsTOPLEVEL_BINDINGput
我可以得到Infinity和NaNn=9.0/0#=>Infinityn.class#=>Floatm=0/0.0#=>NaNm.class#=>Float但是当我想直接访问Infinity或NaN时:Infinity#=>uninitializedconstantInfinity(NameError)NaN#=>uninitializedconstantNaN(NameError)什么是Infinity和NaN?它们是对象、关键字还是其他东西? 最佳答案 您看到打印为Infinity和NaN的只是Float类的两个特殊实例的字符串