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


78

给定

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中的错误吗?还是我在删除时做错了什么?

谢谢


3
您正在做的是向对象添加属性,这与向数组/哈希添加元素不同。您正在寻找一种或多或少地删除属性的方法。尝试删除myHash.key1,如其他注释中所述。
David Andres

2
如果是哈希表,则应使用var myHash = new Object()而不是var myHash = new Array()
cprcrack 2012年

Answers:


182

您正在寻找delete

delete myhash['key2']

请参阅《核心Javascript指南》


1
我认为这是正确的,这就是为什么我首先尝试它。它似乎确实有效,但我的问题实际上出在Json.stringify,不适用于更新问题
Andrew Bullock

8
请使用拼接功能。删除在数组中留下一个洞。
大卫·安德烈斯

2
是前面提到的拼接函数btw。
Per Lundberg 2013年

myhash仅应在当前范围内进行更改时,这不是最佳选择。delete如果其他地方的变量引用该myhash对象,则可能会有副作用。
max pleaner

让我开心@ karim79 tysm

11

为什么要使用new Array();哈希?您需要new Object()改用。

而且我认为您会得到想要的。


4
我一点都不喜欢新手。我更喜欢var myHash = [];
Nosredna

10
或者在这种情况下,myHash = {}; :-)
Nosredna

我同意。数组给您的唯一一件事就是长度,当您更改索引器而不是int时,该长度将永远无法工作。
您的朋友肯

6

您说您不一定知道'key2'在位置[1]。好吧,不是。位置1将被myHash [1]占据。

您正在滥用JavaScript数组,该数组(如函数)允许键/值散列。即使JavaScript允许它,它也没有为您提供处理它的便利,就像为关联数组设计的语言一样。JavaScript的数组方法仅适用于带编号的属性。

您应该做的第一件事是切换到对象而不是数组。您没有充分的理由在这里使用数组而不是对象,所以不要这样做。如果要使用数组,只需对元素编号,然后放弃散列的想法。数组的目的是保存可以按数字索引的信息。

当然,您可以根据需要将哈希(对象)放入数组中。

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

1

另一个选择可能是此John Resig删除方法。可以更好地满足您的需求。如果您知道数组中的索引。


2
完全没有索引就是问题所要表达的内容
安德鲁·布洛克

嘿@AndrewBullock我有一个查询,我得到JSON数组,例如:[{\“ Countrycode \”:\“ DE \”,\“ count \”:\“ 3 \”}],但我想获得类似[{“ DE “:” 3“}]像这样,但是我没有得到这个输出,请帮助我
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.