使用非数字键删除数组元素

时间:2012-06-10 12:29:44

标签: javascript

我有一个对象数组,其中键是一个md5字符串,值是一个对象 [0315778255cca8d2f773642ad1d3678f] = {a:12,b:34}。我需要根据他们的密钥删除数组元素,我尝试拼接但失败的原因我想这些键是非数字的。 我也尝试按位置拼接,但是没有,甚至删除元素,但我们都知道它不理想。

我可以将我的实现从数组更改为对象,但是我也会或多或少地提出相同的问题。

欢迎任何想法

1 个答案:

答案 0 :(得分:2)

splice确实是关于数组索引(因为数组的数字属性被调用),而不是其他属性。

要从对象(包括数组)中删除属性,请使用delete

delete theArray['0315778255cca8d2f773642ad1d3678f'];

尽管它与其他语言中的“删除”相似,但JavaScript中的delete与内存管理没有任何关系(直接);它只是从一个对象中删除一个属性(完全;它不只是将属性的值设置为undefined或其他东西)。

旁注:如果您只使用非数字属性 ,则可能根本不需要数组。使用JavaScript的Array类型的唯一原因是,如果您需要特殊处理,它会给出名称都是数字的属性,魔术length(仅与数字属性相关),以及来自{的内容{1}} - 其中任何一个都没有与其他非索引属性做任何事情。


重新评论以下内容:

  

删除在元素位置留下未定义的内容。我需要完全摆脱它

不,Array.prototype完全删除了该属性。它不会将delete留在原位。您可能认为这样做是因为每当您尝试从不存在的对象中检索属性时,您都会返回undefined。 E.g:

undefined

您可以使用var obj = {}; // Object with no "foo" property at all var x = obj.foo; console.log("x = " + x); // "x = undefined" hasOwnProperty来证明该属性已被删除:

in

var obj = {}; console.log('foo' in obj); // "false" console.log(obj.hasOwnProperty('foo')); // "false" 将检查对象及其原型链; in只检查对象本身。

回到hasOwnProperty

delete

Live example | source

请注意,如果var obj = {}; console.log(obj.hasOwnProperty('foo')); // "false" obj.foo = "bar"; console.log(obj.hasOwnProperty('foo')); // "true" delete obj.foo; console.log(obj.hasOwnProperty('foo')); // "false" obj.foo = "bar"; console.log(obj.hasOwnProperty('foo')); // "true" delete obj['foo']; console.log(obj.hasOwnProperty('foo')); // "false" 是有效标识符,delete obj.foo;delete obj['foo'];都有效。但对于名称不是有效标识符的属性(如md5总和),您必须使用带有字符串的括号表单,如上所示(foo)。