如何在JavaScript中创建哈希或字典对象

Sau*_*mar 163 javascript dictionary

我想在javascript中创建一个地图对象.我提出了以下想法:

 var a = new Array();
 a["key1"] = "value1";
 a["key2"] = "value2";
Run Code Online (Sandbox Code Playgroud)

但那么我怎么能找到一个特定的密钥是否存在?

Que*_*tin 266

如果要使用命名键,请不要使用数组,请使用普通对象.

var a = {};
a["key1"] = "value1";
a["key2"] = "value2";
Run Code Online (Sandbox Code Playgroud)

然后:

if ("key1" in a) {
   // something
} else {
   // something else 
}
Run Code Online (Sandbox Code Playgroud)

  • 语法可缩短为`var a = {'key1':'value1','key2':'value2'};` (17认同)

小智 42

现在,JavaScript中提供了内置的Map类型.它可以用来代替简单地使用Object.所有主流浏览器的当前版本都支持它.

地图不支持[subscript]对象使用的表示法.该语法隐式地将subscript值转换为原始字符串或符号.地图支持任何值作为键,因此您必须使用方法.get(key),.set(key, value).has(key).

var m = new Map();
var key1 = 'key1';
var key2 = {};
var key3 = {};

m.set(key1, 'value1');
m.set(key2, 'value2');

console.assert(m.has(key2), "m should contain key2.");
console.assert(!m.has(key3), "m should not contain key3.");
Run Code Online (Sandbox Code Playgroud)

对象仅支持原始字符串和符号作为键,因为值存储为属性.如果您使用的是Object,它将无法区分key2,key3因为它们的字符串表示形式是相同的:

var o = new Object();
var key1 = 'key1';
var key2 = {};
var key3 = {};

o[key1] = 'value1';
o[key2] = 'value2';

console.assert(o.hasOwnProperty(key2), "o should contain key2.");
console.assert(!o.hasOwnProperty(key3), "o should not contain key3."); // Fails!
Run Code Online (Sandbox Code Playgroud)

有关

  • @Ghashange该提案已经标准化,并且在所有浏览器的当前版本中都受支持.:) (3认同)
  • Chrome上的`Map`很慢,即使获得一个属性,而且,正如你所说,它的界面与普通的javascript对象完全不兼容.例如,你不能使用`a [key]`和`Object.keys()`.我不建议使用它. (3认同)
  • @sports你是对的,Node.js默认没有启用许多新功能(但是!).如果设置`node --harmony`标志,则启用它,并在IO.js中默认启用. (2认同)

Rob*_*ert 38

您想要创建一个Object,而不是一个Array.

像这样,

var Map = {};

Map['key1'] = 'value1';
Map['key2'] = 'value2';
Run Code Online (Sandbox Code Playgroud)

您可以通过多种方式检查密钥是否存在:

Map.hasOwnProperty(key);
Map[key] != undefined // For illustration // Edit, remove null check
if (key in Map) ...
Run Code Online (Sandbox Code Playgroud)

  • 如果你重新定义`undefined`,你应该得到它导致的任何错误.null表示故意的非值,而undefined表示未初始化的变量.仅仅因为`null == undefined`将返回true,并不意味着null与undefined完全相同. (10认同)