如何在JavaScript中从哈希表中删除键和值

88

考虑到

var myHash = new Array();
myHash['key1'] = { Name: 'Object 1' };
myHash['key2'] = { Name: 'Object 2' };
myHash['key3'] = { Name: 'Object 3' };

我该如何从哈希表中移除 key2object 2,使其最终的状态就像我执行了以下操作:

var myHash = new Array();
myHash['key1'] = { Name: 'Object 1' };
myHash['key3'] = { Name: 'Object 3' };

删除操作不能实现我想要的功能;

delete myHash['key2'] 

只是简单地给了我这个:

var myHash = new Array();
myHash['key1'] = { Name: 'Object 1' };
myhash['key2'] = null;
myHash['key3'] = { Name: 'Object 3' };

我能找到的有关 spliceslice 的唯一文档都涉及整数索引器,而我没有这种情况。

编辑:我也不知道 'key2' 是否一定在 [1] 位置。

更新

好吧,稍微转移了注意力,似乎删除确实可以做到我想要的事情,然而我正在使用 json2.js 将我的对象转换为 JSON 并将其推送回服务器,

删除后,myHash 会被序列化为:

[ { Name: 'Object 1' }, null, { Name: 'Object 3' } ]

这是在json2.js中的一个错误吗?还是我在使用delete时出了什么问题?

谢谢


3
你正在给一个对象添加属性,这与向数组/哈希表中添加元素不同。你似乎想要找到一种移除属性的方法。可以试试在其他评论中提到的 delete myHash.key1。 - David Andres
2
如果它是一个哈希表,你应该使用var myHash = new Object()而不是var myHash = new Array() - cprcrack
4个回答

195

1
我之前认为这是正确的,所以我首先尝试了它。它似乎有效,但我的问题实际上在于Json.stringify,我会更新问题。 - Andrew Bullock
8
请使用splice函数代替。使用delete会在数组中留下一个空洞。 - David Andres
2
这是之前提到的splice函数,顺便说一下。 - Per Lundberg
myhash的更改仅在当前范围内进行时,这不是最佳选项。如果其他地方的变量引用myhash对象,则delete可能会产生副作用。 - max pleaner

11
为什么要使用new Array();作为哈希表?应该使用new Object()代替。
我认为这样做可以让你得到想要的结果。

4
我不喜欢新的。我更喜欢使用 var myHash = []; - Nosredna
11
在这种情况下,我的哈希表为myHash={};-) - Nosredna
我同意。数组唯一给你的是一个长度,如果你将索引器更改为除int以外的其他类型时,它永远不起作用。 - Your Friend Ken

6

你说你不确定'key2'是否在位置[1]。实际上,它并不在那里。位置1应该被myHash [1]所占据。

你正在滥用JavaScript数组,这些数组(就像函数一样)允许键/值哈希。尽管JavaScript允许这样做,但它并没有为此提供处理工具,因为它是为关联数组设计的语言。JavaScript的数组方法仅适用于数字属性。

你应该做的第一件事是切换到对象而不是数组。你没有使用数组而不是对象的好理由,所以不要这样做。如果你想使用数组,只需对元素进行编号,放弃哈希的想法。数组的目的是存储可以按数字索引的信息。

当然,你可以将哈希(对象)放入数组中。

myhash[1]={"key1","brightOrangeMonkey"};

1

另一个选项可能是这个John Resig remove method。如果你知道数组中的索引,它可以更好地适应你的需求。


2
没有索引正是问题陈述中所描述的。 - Andrew Bullock
嘿@AndrewBullock,我有一个问题。我得到了JSON数组,例如:[{"Countrycode":"DE","count":"3"}],但我想要像[{"DE":"3"}]这样的格式,但我没有得到这个输出。请帮帮我。 - user7918630

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接