假设我创建一个对象如下:
let myObject = {
"ircEvent": "PRIVMSG",
"method": "newURI",
"regex": "^http://.*",
};
我应该如何删除属性regex
以结束新myObject
的如下?
let myObject = {
"ircEvent": "PRIVMSG",
"method": "newURI",
};
假设我创建一个对象如下:
let myObject = {
"ircEvent": "PRIVMSG",
"method": "newURI",
"regex": "^http://.*",
};
我应该如何删除属性regex
以结束新myObject
的如下?
let myObject = {
"ircEvent": "PRIVMSG",
"method": "newURI",
};
要从对象中删除属性(改变对象),您可以这样做:
delete myObject.regex;
// or,
delete myObject['regex'];
// or,
var prop = "regex";
delete myObject[prop];
演示
var myObject = {
"ircEvent": "PRIVMSG",
"method": "newURI",
"regex": "^http://.*"
};
delete myObject.regex;
console.log(myObject);
对于任何有兴趣阅读更多相关信息的人,Stack Overflow 用户kangaxdelete
在他们的博客上写了一篇关于声明的非常深入的博客文章,理解删除。强烈推荐。
如果你想要一个新对象,除了一些之外,所有的键都是原始的,你可以使用destructuring。
演示
let myObject = {
"ircEvent": "PRIVMSG",
"method": "newURI",
"regex": "^http://.*"
};
const {regex, ...newObj} = myObject;
console.log(newObj); // has no 'regex' key
console.log(myObject); // remains unchanged
JavaScript 中的对象可以被认为是键和值之间的映射。该delete
运算符用于删除这些键,通常称为对象属性,一次删除一个。
var obj = {
myProperty: 1
}
console.log(obj.hasOwnProperty('myProperty')) // true
delete obj.myProperty
console.log(obj.hasOwnProperty('myProperty')) // false
在delete
操作者不直接自由存储器,并且它简单地从分配的值不同null
或undefined
到的属性,在该属性本身从对象中删除。请注意,如果被删除的属性的值是一个引用类型(一个对象),并且程序的另一部分仍然持有对该对象的引用,那么该对象当然不会被垃圾收集,直到对它的所有引用都有消失了。
delete
仅适用于描述符将其标记为可配置的属性。
var myObject = {"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};
delete myObject.regex;
console.log ( myObject.regex); // logs: undefined
这适用于 Firefox 和 Internet Explorer,我认为它适用于所有其他人。
老问题,现代答案。使用对象解构(ECMAScript 6 的一项特性),它非常简单:
const { a, ...rest } = { a: 1, b: 2, c: 3 };
或者使用问题示例:
const myObject = {"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};
const { regex, ...newObject } = myObject;
console.log(newObject);
编辑:
要重新分配给相同的变量,请使用let
:
let myObject = {"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};
({ regex, ...myObject } = myObject);
console.log(myObject);
该delete
运算符用于从对象中删除属性。
const obj = { foo: "bar" }
delete obj.foo
obj.hasOwnProperty("foo") // false
请注意,对于数组,这与删除元素不同。要从数组中删除元素,请使用Array#splice
或Array#pop
。例如:
arr // [0, 1, 2, 3, 4]
arr.splice(3,1); // 3
arr // [0, 1, 2, 4]
delete
JavaScript 中的关键字与 C 和 C++ 中的关键字的功能不同:它不直接释放内存。相反,它的唯一目的是从对象中删除属性。
对于数组,删除与索引对应的属性,会创建一个稀疏数组(即其中有一个“洞”的数组)。大多数浏览器将这些缺失的数组索引表示为“空”。
var array = [0, 1, 2, 3]
delete array[2] // [0, 1, empty, 3]
请注意,delete
不会重定位array[3]
到array[2]
.
JavaScript 中不同的内置函数以不同的方式处理稀疏数组。
for...in
将完全跳过空索引。
传统for
循环将返回undefined
索引处的值。
任何使用的方法Symbol.iterator
都将返回undefined
索引处的值。
forEach
,map
并且reduce
会简单地跳过缺失的索引。
因此,delete
运算符不应用于从数组中删除元素的常见用例。数组有一个专门的方法来删除元素和重新分配内存:Array#splice()
和Array#pop
。
Array#splice
改变数组,并返回任何删除的索引。deleteCount
元素从 index 中移除start
,并从 indexitem1, item2... itemN
插入到数组中start
。如果deleteCount
省略,则 startIndex 中的元素将被删除到数组的末尾。
let a = [0,1,2,3,4]
a.splice(2,2) // returns the removed elements [2,3]
// ...and `a` is now [0,1,4]
还有一个类似命名的,但不同的,功能上Array.prototype
:Array#slice
。
Array#slice
是非破坏性的,并返回一个新数组,其中包含从start
to指示的索引end
。如果end
未指定,则默认为数组的末尾。如果end
为正,则指定要停止的从零开始的非包含索引。如果end
它是负数,它通过从数组的末尾开始倒数来指定要停止的索引(例如,-1 将省略最终索引)。如果end <= start
,结果是一个空数组。
let a = [0,1,2,3,4]
let slices = [
a.slice(0,2),
a.slice(2,2),
a.slice(2,3),
a.slice(2,5) ]
// a [0,1,2,3,4]
// slices[0] [0 1]- - -
// slices[1] - - - - -
// slices[2] - -[3]- -
// slices[3] - -[2 4 5]
Array#pop
从数组中删除最后一个元素,并返回该元素。此操作更改数组的长度。