如何在 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,它将无法区分 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!
相关
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
不可靠,不应该使用(更重要的是:这是完全错误的)。
在什么意义上是错误的......它正在检查一个值是空值还是未定义,这取决于他想要做什么,这可能会有所帮助:\...
一个值可以是null
和undefined
,这并不意味着该属性不存在。 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 中创建哈希或字典对象 [重复]的主要内容,如果未能解决你的问题,请参考以下文章