我需要像在 C# 中那样使用 JavaScript 存储一些统计信息:
Dictionary<string, int> statistics;
statistics["Foo"] = 10;
statistics["Goo"] = statistics["Goo"] + 1;
statistics.Add("Zoo", 1);
JavaScript 中是否有Hashtable
类似的东西Dictionary<TKey, TValue>
?
我怎么能以这种方式存储值?
我需要像在 C# 中那样使用 JavaScript 存储一些统计信息:
Dictionary<string, int> statistics;
statistics["Foo"] = 10;
statistics["Goo"] = statistics["Goo"] + 1;
statistics.Add("Zoo", 1);
JavaScript 中是否有Hashtable
类似的东西Dictionary<TKey, TValue>
?
我怎么能以这种方式存储值?
关联数组:简单来说,关联数组使用字符串而不是整数作为索引。
创建一个对象
var dictionary = {};
JavaScript 允许您使用以下语法向对象添加属性:
Object.yourProperty = value;
相同的替代语法是:
Object["yourProperty"] = value;
如果可以,还可以使用以下语法创建键值对象映射:
var point = { x:3, y:2 };
point["x"] // returns 3
point.y // returns 2
您可以使用 for..in 循环构造遍历关联数组,如下所示
for(var key in Object.keys(dict)){
var value = dict[key];
/* use key/value for intended purpose */
}
var associativeArray = {};
associativeArray["one"] = "First";
associativeArray["two"] = "Second";
associativeArray["three"] = "Third";
如果您来自面向对象的语言,您应该查看这篇文章。
所有现代浏览器都支持 JavaScript Map对象。使用 Map 比使用 Object 更好的原因有两个:
- 一个对象有一个原型,所以地图中有默认的键。
- 对象的键是字符串,它们可以是 Map 的任何值。
- 当您必须跟踪对象的大小时,您可以轻松获得地图的大小。
例子:
var myMap = new Map();
var keyObj = {},
keyFunc = function () {},
keyString = "a string";
myMap.set(keyString, "value associated with 'a string'");
myMap.set(keyObj, "value associated with keyObj");
myMap.set(keyFunc, "value associated with keyFunc");
myMap.size; // 3
myMap.get(keyString); // "value associated with 'a string'"
myMap.get(keyObj); // "value associated with keyObj"
myMap.get(keyFunc); // "value associated with keyFunc"
如果您希望未从其他对象引用的键被垃圾收集,请考虑使用WeakMap而不是 Map。
除非您有特定的理由不这样做,否则只需使用普通对象。可以使用哈希表样式的语法引用 JavaScript 中的对象属性:
var hashtable = {};
hashtable.foo = "bar";
hashtable['bar'] = "foo";
两个foo
和bar
元素,现在则引用如下:
hashtable['foo'];
hashtable['bar'];
// Or
hashtable.foo;
hashtable.bar;
当然,这确实意味着您的密钥必须是字符串。如果它们不是字符串,它们会在内部转换为字符串,因此它可能仍然有效。你的旅费可能会改变。
由于 JavaScript 中的每个对象都表现得像 - 并且通常被实现为 - 一个哈希表,我只是同意......
var hashSweetHashTable = {};