从对象中删除属性 (JavaScript)

IT技术 javascript json regex object properties
2020-12-26 16:00:26

假设我创建一个对象如下:

let myObject = {
  "ircEvent": "PRIVMSG",
  "method": "newURI",
  "regex": "^http://.*",
};

我应该如何删除属性regex以结束新myObject的如下?

let myObject = {
  "ircEvent": "PRIVMSG",
  "method": "newURI",
};
6个回答

要从对象中删除属性(改变对象),您可以这样做:

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

@nickf 文章是 404 :(
2021-02-10 16:00:26
我用这种方法遇到的问题是,如果破坏在条件内,它会使 ESlint 变得疯狂。
2021-02-19 16:00:26
@Loolooii 您可以重命名解构赋值中的变量以满足您argsIgnorePatternno-unused-vars规则。容易解决的问题。
2021-02-27 16:00:26
文章不见了——好内容不见了,真难过,很高兴我们有回溯机器:web.archive.org/web/20210224201033/http : //perfectkills.com/... :)
2021-03-02 16:00:26
这是一个很好的方法,但只有当你真的要使用regex时才有用,否则 eslint 会抱怨一个未使用的变量。
2021-03-08 16:00:26

JavaScript 中的对象可以被认为是键和值之间的映射。delete运算符用于删除这些键,通常称为对象属性,一次删除一个。

var obj = {
  myProperty: 1    
}
console.log(obj.hasOwnProperty('myProperty')) // true
delete obj.myProperty
console.log(obj.hasOwnProperty('myProperty')) // false

delete操作者不直接自由存储器,并且它简单地从分配的值不同nullundefined到的属性,在该属性本身从对象中删除。请注意,如果被删除的属性是一个引用类型(一个对象),并且程序的另一部分仍然持有对该对象的引用,那么该对象当然不会被垃圾收集,直到对它的所有引用都有消失了。

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);

您可以在 Babel 试用版编辑器中看到它的运行情况。


编辑:

要重新分配给相同的变量,请使用let

let myObject = {"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};
({ regex, ...myObject } = myObject);
console.log(myObject);
如果属性名称不同,即如果我将它放在变量中,我该如何解构?
2021-02-25 16:00:26
请参阅下面的这个答案;stackoverflow.com/a/52301527
2021-03-03 16:00:26

delete运算符用于从对象中删除属性。

const obj = { foo: "bar" }
delete obj.foo
obj.hasOwnProperty("foo") // false

请注意,对于数组,这与删除元素不同要从数组中删除元素,请使用Array#spliceArray#pop例如:

arr // [0, 1, 2, 3, 4]
arr.splice(3,1); // 3
arr // [0, 1, 2, 4]

细节

deleteJavaScript 中的关键字与 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(start[, deleteCount[, item1[, item2[, ...]]]])

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.prototypeArray#slice

数组#slice([begin[, end]])

Array#slice是非破坏性的,并返回一个新数组,其中包含从startto指示的索引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]

数组#pop

Array#pop从数组中删除最后一个元素,并返回该元素。此操作更改数组的长度。