2012-06-10 37 views
1

我有一个对象数组,其中的键是一个md5字符串,值是一个对象 [0315778255cca8d2f773642ad1d3678f] = {a:12,b:34}。我需要删除基于他们的关键数组元素,我试着拼接,但失败,因为我想这些键是非数字。 我也尝试按位置进行拼接,但是失败了,甚至删除了元素,但我们都知道它并不理想。使用非数字键删除数组元素

我可以改变我的实现从数组到对象,但也会有相同的问题或多或少我想。

任何想法欢迎

回答

2

splice确实有关阵列索引(作为阵列的数字属性的称呼),不是关于其他属性。

从对象(包括数组)删除一个属性,使用delete

delete theArray['0315778255cca8d2f773642ad1d3678f']; 

尽管它相似的其他语言“删除”,delete在JavaScript中有没有(直接)做记忆管理;它所做的就是从对象中删除一个属性(完全是这样;它不会将属性的值设置为undefined或其他)。

备注:如果你是只有使用非数字属性,你可能根本不需要数组。使用JavaScript的Array类型的唯一原因是,如果您需要特殊处理,它会提供名称均为数字,属性为length(仅与数字属性相关)的属性,以及来自Array.prototype的内容  —其中没有任何内容会执行任何操作其他非索引属性。


重新下方的评论:

删除叶中的元素代替不确定的。我需要完全摆脱它

不,delete完全删除属性。它不会将undefined代替。您可能会认为这样做,因为任何时候您尝试从不存在的对象中检索属性时,都会返回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

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" 

Live example | source

请注意,如果foo是有效标识符,则delete obj.foo;delete obj['foo'];都可以使用。但是,对于名称不是有效标识符的属性(如您的md5总和),您必须像上面显示的那样使用带括号的字符串(delete theArray['0315778255cca8d2f773642ad1d3678f'];)。

+0

delete在元素处留下未定义的元素。我需要完全摆脱它 – mbouclas

+0

@mbouclas:不,它不。我已经添加了答案来解释你所看到的。 –