假设我有这样的代码:
var myArray = new Object();
myArray["firstname"] = "Bob";
myArray["lastname"] = "Smith";
myArray["age"] = 25;
现在如果我想删除“lastname”?....有什么等价物吗 (“姓”)myArray .remove () ?
(我需要元素消失,因为元素的数量很重要,我想保持东西干净。)
假设我有这样的代码:
var myArray = new Object();
myArray["firstname"] = "Bob";
myArray["lastname"] = "Smith";
myArray["age"] = 25;
现在如果我想删除“lastname”?....有什么等价物吗 (“姓”)myArray .remove () ?
(我需要元素消失,因为元素的数量很重要,我想保持东西干净。)
当前回答
之前的回答都没有提到JavaScript一开始就没有关联数组这一事实——没有数组类型,参见typeof。
JavaScript拥有的是带有动态属性的对象实例。当属性与Array对象实例的元素混淆时,就一定会发生糟糕的事情:
问题
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
其他回答
如果你想要一个更实用和优雅的方法,你可以这样做:
const o = { firstName: "foo", lastName: "bar" };
const { lastName, ...removed } = o;
lastName // bar
removed // { firstName: "foo" }
注意,如果对象中没有剩余项,则remove的值将是未定义的。
正如其他答案所指出的,您使用的不是JavaScript数组,而是JavaScript对象,它的工作原理几乎类似于其他语言中的关联数组,只是所有键都被转换为字符串。新的Map以原始类型存储键。
如果你有一个数组而不是一个对象,你可以使用数组的.filter函数,返回一个不删除你想要删除的项的新数组:
var myArray = ['Bob', 'Smith', 25];
myArray = myArray.filter(function(item) {
return item !== 'Smith';
});
如果您使用的是较旧的浏览器和jQuery, jQuery有一个$。Grep方法,工作原理类似:
myArray = $.grep(myArray, function(item) {
return item !== 'Smith';
});
如果,出于某种原因,删除键不起作用(就像它对我不起作用一样),你可以将它拼接出来,然后过滤未定义的值:
// To cut out one element via arr.splice(indexToRemove, numberToRemove);
array.splice(key, 1)
array.filter(function(n){return n});
不要尝试连接它们,因为拼接返回删除的元素;
你可以通过显式地将一个条目分配给'undefined'来从你的映射中删除它。就像你的情况:
myArray[“lastname”] = undefined;
通过使用“delete”关键字,它将从JavaScript中的array中删除array元素。
例如,
考虑以下陈述。
var arrayElementToDelete = new Object();
arrayElementToDelete["id"] = "XERTYB00G1";
arrayElementToDelete["first_name"] = "Employee_one";
arrayElementToDelete["status"] = "Active";
delete arrayElementToDelete["status"];
代码的最后一行将从数组中删除键为“status”的数组元素。