假设我有以下代码:
var myArray = new Object();
myArray["firstname"] = "Bob";
myArray["lastname"] = "Smith";
myArray["age"] = 25;
现在如果我想要移除 "lastname" ,是否有类似于 myArray["lastname"].remove()
的等效方法呢?(我需要移除此元素,因为元素的数量很重要,我想保持数据干净)
假设我有以下代码:
var myArray = new Object();
myArray["firstname"] = "Bob";
myArray["lastname"] = "Smith";
myArray["age"] = 25;
现在如果我想要移除 "lastname" ,是否有类似于 myArray["lastname"].remove()
的等效方法呢?(我需要移除此元素,因为元素的数量很重要,我想保持数据干净)
delete
操作符:const o = { lastName: 'foo' }
o.hasOwnProperty('lastName') // true
delete o['lastName']
o.hasOwnProperty('lastName') // false
delete
应用于Array
的索引属性时,您将创建一个稀疏数组(即,带有缺失索引的数组)。Array
实例时,如果您不想创建稀疏数组 - 通常情况下是这样的 - 那么您应该使用Array#splice
或Array#pop
。delete
运算符不会直接释放内存。其目的是从对象中删除属性。当然,如果要删除的属性持有对对象o
的唯一剩余引用,则o
随后将以正常方式进行垃圾回收。delete
运算符可能会影响JavaScript引擎优化 代码的能力。delete myArray[0]
,将会引起问题。请参考 https://dev59.com/snRC5IYBdhLWcg3wS_AF#9973592 和 Deleting array elements。 - Saullength
属性保持不变。 - SaulmyArray
真的被用作数组,就会有问题,但事实并非如此(myArray
是一个不幸的名称),它是一个对象。因此在这种情况下,使用delete
是可以的。请注意,即使它是作为new Array()
创建并用作关联数组,仍然是可以的。不过,如果使用真正的数组,则需要注意你提出的警告。 - johndodoJavaScript中的所有对象都是实现为哈希表/关联数组。因此,以下是等效的:
alert(myObj["SomeProperty"]);
alert(myObj.SomeProperty);
如前所述,你可以通过delete
关键字从一个对象中“删除”一个属性。这个关键字有两种使用方式:
delete myObj["SomeProperty"];
delete myObj.SomeProperty;
希望额外的信息对您有所帮助...
myObj['some;property']
可以工作,但 myObj.some;property
不行(显然的原因)。另外,可能不太明显的是,在括号表示法中可以使用变量,例如 var x = 'SomeProperty'; alert(myObj[x])
。 - Kip之前的回答都没有涉及到JavaScript本身并没有关联数组的事实 - 事实上不存在array
类型,详见typeof
。
JavaScript拥有的是带有动态属性的对象实例。当属性与数组对象实例的元素混淆时,会发生糟糕的事情:
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
都是对象,尝试使用typeof new Array();
或typeof []
进行验证。 Array
只是一种特定类型的对象,而不是完全“不同的东西”。在JS中,对象通过它们的构造函数名称和原型链来区分,参见基于原型的编程。 - Sauldelete
操作符在处理Array
方面存在的不足。 - Sauldelete
没有缺陷。 delete
的设计目的是删除属性。就这样。将 delete
运算符应用于数组的索引会删除该索引。还需要什么呢?你会得到一个稀疏数组,这是语言的一个特性。如果您不想要稀疏数组,请勿删除索引:使用 splice
或 pop
。 - Ben Aston这只是删除了数组中的对象,但数组长度仍然保持不变。
要从数组中移除元素,你需要做像这样的操作:
array.splice(index, 1);
虽然已被接受的答案是正确的,但它缺少了解释为什么它有效的说明。
首先,你的代码应该反映出这不是一个数组:
var myObject = new Object();
myObject["firstname"] = "Bob";
myObject["lastname"] = "Smith";
myObject["age"] = 25;
请注意,所有对象(包括Array
)都可以以这种方式使用。但是,请不要指望标准的JavaScript数组函数(如pop、push等)能够用于对象!
正如接受的答案中所说,您可以使用delete
从对象中删除条目:
delete myObject["lastname"]
你应该决定使用哪种方式 - 要么是对象(关联数组/字典),要么是数组(映射表)。切勿混用两者。
在Airbnb样式指南中,有一种优雅的方法可以做到这一点(ECMAScript 7):
const myObject = {
a: 1,
b: 2,
c: 3
};
const { a, ...noA } = myObject;
console.log(noA); // => { b: 2, c: 3 }
版权所有:https://codeburst.io/use-es2015-object-rest-operator-to-omit-properties-38a3ecffe90
正如其他答案所指出的那样,你没有使用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';
});
const o = { firstName: "foo", lastName: "bar" };
const { lastName, ...removed } = o;
lastName // bar
removed // { firstName: "foo" }
removed
的值将为未定义。"delete"
关键字,可以从 JavaScript 数组中删除数组元素。var arrayElementToDelete = new Object();
arrayElementToDelete["id"] = "XERTYB00G1";
arrayElementToDelete["first_name"] = "Employee_one";
arrayElementToDelete["status"] = "Active";
delete arrayElementToDelete["status"];
splice
从对象数组中完全删除一项:Object.prototype.removeItem = function (key, value) {
if (value == undefined)
return;
for (var i in this) {
if (this[i][key] == value) {
this.splice(i, 1);
}
}
};
var collection = [
{ id: "5f299a5d-7793-47be-a827-bca227dbef95", title: "one" },
{ id: "87353080-8f49-46b9-9281-162a41ddb8df", title: "two" },
{ id: "a1af832c-9028-4690-9793-d623ecc75a95", title: "three" }
];
collection.removeItem("id", "87353080-8f49-46b9-9281-162a41ddb8df");