1

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

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

欢迎任何想法

4

1 回答 1

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您可以使用or证明该属性确实被删除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"

实例| 来源

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

于 2012-06-10T12:31:16.890 回答