假设我有这个代码:
var myArray = new Object();
myArray["firstname"] = "Bob";
myArray["lastname"] = "Smith";
myArray["age"] = 25;
现在,如果我想删除“姓氏”?....是否有一些等价物
myArray["lastname"].remove()
?
(我需要元素消失,因为元素的数量很重要,我想保持干净。)
假设我有这个代码:
var myArray = new Object();
myArray["firstname"] = "Bob";
myArray["lastname"] = "Smith";
myArray["age"] = 25;
现在,如果我想删除“姓氏”?....是否有一些等价物
myArray["lastname"].remove()
?
(我需要元素消失,因为元素的数量很重要,我想保持干净。)
JavaScript 中的对象可以被认为是关联数组,将键(属性)映射到值。
要从 JavaScript 中的对象中删除属性,请使用delete
运算符:
const o = { lastName: 'foo' }
o.hasOwnProperty('lastName') // true
delete o['lastName']
o.hasOwnProperty('lastName') // false
请注意,当delete
应用于 的索引属性时Array
,您将创建一个稀疏填充的数组(即缺少索引的数组)。
在处理 的实例时Array
,如果您不想创建一个稀疏填充的数组 - 而您通常不想 - 那么您应该使用Array#splice
or Array#pop
。
请注意,delete
JavaScript 中的运算符不会直接释放内存。它的目的是从对象中删除属性。当然,如果被删除的属性持有对象的唯一剩余引用o
,那么o
随后将以正常方式进行垃圾回收。
JavaScript 中的所有对象都实现为哈希表/关联数组。因此,以下是等效的:
alert(myObj["SomeProperty"]);
alert(myObj.SomeProperty);
而且,正如已经指出的,delete
您可以通过关键字从对象中“删除”一个属性,您可以通过两种方式使用它:
delete myObj["SomeProperty"];
delete myObj.SomeProperty;
希望额外的信息有帮助...
之前的答案都没有解决 JavaScript 没有关联数组开始的事实 - 没有这样的array
类型,请参阅typeof
。
JavaScript 拥有的是具有动态属性的对象实例。当属性与 Array 对象实例的元素混淆时,Bad Things™ 必然会发生:
var elements = new Array()
elements.push(document.getElementsByTagName("head")[0])
elements.push(document.getElementsByTagName("title")[0])
elements["prop"] = document.getElementsByTagName("body")[0]
console.log("number of elements: ", elements.length) // Returns 2
delete elements[1]
console.log("number of elements: ", elements.length) // Returns 2 (?!)
for (var i = 0; i < elements.length; i++)
{
// Uh-oh... throws a TypeError when i == 1
elements[i].onmouseover = function () { window.alert("Over It.")}
console.log("success at index: ", i)
}
要拥有不会对您造成伤害的通用删除功能,请使用:
Object.prototype.removeItem = function (key) {
if (!this.hasOwnProperty(key))
return
if (isNaN(parseInt(key)) || !(this instanceof Array))
delete this[key]
else
this.splice(key, 1)
};
//
// Code sample.
//
var elements = new Array()
elements.push(document.getElementsByTagName("head")[0])
elements.push(document.getElementsByTagName("title")[0])
elements["prop"] = document.getElementsByTagName("body")[0]
console.log(elements.length) // Returns 2
elements.removeItem("prop")
elements.removeItem(0)
console.log(elements.hasOwnProperty("prop")) // Returns false as it should
console.log(elements.length) // returns 1 as it should
这只会删除对象,但它仍然保持数组长度不变。
要从数组中删除元素,您需要执行以下操作:
array.splice(index, 1);
虽然接受的答案是正确的,但它没有解释它为什么起作用。
首先,您的代码应该反映这不是数组的事实:
var myObject = new Object();
myObject["firstname"] = "Bob";
myObject["lastname"] = "Smith";
myObject["age"] = 25;
请注意,所有对象(包括Array
s)都可以这样使用。但是,不要指望标准的 JavaScript 数组函数(pop、push 等)可以处理对象!
正如在接受的答案中所说,然后您可以使用delete
从对象中删除条目:
delete myObject["lastname"]
你应该决定你想走哪条路——要么使用对象(关联数组/字典),要么使用数组(地图)。切勿将两者混用。