如何在 JavaScript 中创建哈希或字典对象 [重复]

Posted

技术标签:

【中文标题】如何在 JavaScript 中创建哈希或字典对象 [重复]【英文标题】:How to create a hash or dictionary object in JavaScript [duplicate] 【发布时间】:2011-09-11 23:51:10 【问题描述】:

我想在 javascript 中创建一个地图对象。我想到了以下想法:

 var a = new Array();
 a["key1"] = "value1";
 a["key2"] = "value2";

但是我怎样才能找到一个特定的键是否存在呢?

【问题讨论】:

【参考方案1】:

如果你想要命名键,不要使用数组,使用普通对象。

var a = ;
a["key1"] = "value1";
a["key2"] = "value2";

然后:

if ("key1" in a) 
   // something
 else 
   // something else 

【讨论】:

如何稍后在“a”中按下新键。 a.push("key3","value3") 会起作用吗? push 是一个数组方法,这里有一个普通对象。何时可以修改对象没有限制,您可以使用与答案中相同的语法:a["key3"] = "value3"; 语法可以缩短为var a = 'key1': 'value1', 'key2': 'value2'; 如何使用 key 移除元素? @DushyantBangal del a["key1"]del a.key1【参考方案2】:

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

地图不支持对象使用的[subscript] 表示法。该语法隐式地将subscript 值转换为原始字符串或符号。 Map 支持任何值作为键,因此您必须使用方法.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.");

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

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!

相关

MDN 文档:Map、Symbol、Set、WeakMap、WeakSet

【讨论】:

您应该小心,因为这是“实验性技术,是 ECMAScript 6 (Harmony) 提案的一部分” someMap.set(key, val) 在 nodejs 中不起作用 @sports 你说得对,Node.js 默认没有启用很多新功能(还没有!)。如果你设置了node --harmony 标志就会启用它,并且在 IO.js 中默认启用。 @Ghashange 该提案已被标准化,并在所有浏览器的当前版本中得到支持。 :) Chrome 上的 Map 很慢,即使是获取属性也是如此,而且,正如你所说,它的接口与普通的 javascript 对象完全不兼容。例如,您不能使用a[key]Object.keys()。我不建议使用它。【参考方案3】:

你想创建一个对象,而不是一个数组。

这样,

var Map = ;

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

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

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

【讨论】:

这个Map[key] != null && Map[key] != undefined 不可靠,不应该使用(更重要的是:这是完全错误的)。 在什么意义上是错误的......它正在检查一个值是空值还是未定义,这取决于他想要做什么,这可能会有所帮助:\... 一个值可以是nullundefined,这并不意味着该属性不存在。 Plus undefined 可以在 JavaScript 中重新定义(试试看!),所以我永远不会依赖它。 如果你重新定义undefined,你应该得到它导致的任何错误。 null 表示故意的非值,而 undefined 表示未初始化的变量。仅仅因为null == undefined 将返回 true,并不意味着 null 与 undefined 完全相同。 var x = ; undefined = true; x.key1 = undefined; x.key1 === undefined; /* true */ x.key1 === true; /* true */ typeof x.key1 === "undefined"; /* false */【参考方案4】:

使用in 运算符:例如"key1" in a.

【讨论】:

【参考方案5】:
if( a['desiredKey'] !== undefined )

   // it exists

【讨论】:

一个键可能存在但有一个未定义的值。

以上是关于如何在 JavaScript 中创建哈希或字典对象 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

javascript 如何在JavaScript中创建对象或数组的副本?

如何在 Javascript 中创建查询参数?

如何在类型变量中创建任何类型的字典? [复制]

如何在 Python 中创建一个 trie

如何在 Ruby 中创建对象的深层副本?

使用 或 new Object() 在 JavaScript 中创建一个空对象?