考虑到一个对象:
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"
};
当前回答
使用 ramda#dissoc 您将获得一个新的对象,而无需属性 regex:
const newObject = R.dissoc('regex', myObject);
// newObject !== myObject
你也可以使用其他功能来实现相同的效果 - 忽略,选择,...
其他回答
丹的说法是“删除”是非常缓慢的,他发布的参考标志是怀疑的,所以我自己在Chrome 59中进行了测试。
var iterationsTotal = 10000000; // 10 million
var o;
var t1 = Date.now(),t2;
for (let i=0; i<iterationsTotal; i++) {
o = {a:1,b:2,c:3,d:4,e:5};
delete o.a; delete o.b; delete o.c; delete o.d; delete o.e;
}
console.log ((t2=Date.now())-t1); // 6135
for (let i=0; i<iterationsTotal; i++) {
o = {a:1,b:2,c:3,d:4,e:5};
o.a = o.b = o.c = o.d = o.e = undefined;
}
console.log (Date.now()-t2); // 205
请注意,我故意在一个旋转周期内进行了多个“删除”操作,以尽量减少其他操作所造成的效果。
假设你有一个类似于此的对象:
var Hogwarts = {
staff : [
'Argus Filch',
'Filius Flitwick',
'Gilderoy Lockhart',
'Minerva McGonagall',
'Poppy Pomfrey',
...
],
students : [
'Hannah Abbott',
'Katie Bell',
'Susan Bones',
'Terry Boot',
'Lavender Brown',
...
]
};
删除物品财产
delete Hogwarts.staff;
delete Hogwarts['staff'];
删除 array index
现在,如果你想移除一个员工或学生,程序有点不同,因为两种属性都是由自己组成的。
Hogwarts.staff.splice(3, 1);
Hogwarts.staff.splice(Hogwarts.staff.indexOf('Minerva McGonnagall') - 1, 1);
笔记
虽然你技术上可以使用删除一个序列,使用它会导致收到错误的结果,当打电话,例如,Hogwarts.staff.length 后来。
因此,在从对象中删除值时,首先要考虑您是否正在处理对象属性,或者您是否正在处理序列值,并根据此选择适当的策略。
如果你想尝试这个,你可以使用这个Fiddle作为一个起点。
这里有很多好答案,但我只是想说,当使用删除删除在JavaScript中删除一个属性时,很常见首先检查该属性是否存在,以防止错误。
E.G
var obj = {"property":"value", "property2":"value"};
if (obj && obj.hasOwnProperty("property2")) {
delete obj.property2;
} else {
//error handling
}
由于JavaScript的动态性质,经常有情况,你只是不知道是否存在的财产。 检查obj是否存在之前&& 也确保你不会扔错误,因为在未定义的对象上呼叫 hasOwnProperty() 函数。
对不起,如果这并没有添加到您的具体使用案例,但我认为这是一个很好的设计,在管理对象和其属性时适应。
ECMAScript 2015(或ES6)配备了内置的反射对象,可以通过使用目标对象和属性密钥的 Reflect.deleteProperty() 函数来删除对象属性:
Reflect.deleteProperty(myJSONObject, 'regex');
相当于:
delete myJSONObject['regex'];
但是,如果对象的属性无法配置,则不能通过删除属性函数或删除操作员删除它:
let obj = Object.freeze({ prop: "value" });
let success = Reflect.deleteProperty(obj, "prop");
console.log(success); // false
console.log(obj.prop); // value
Object.freeze() 使对象的所有属性不可配置(除其他事物外)。 deleteProperty 函数(以及 delete 运营商)在试图删除其任何属性时返回虚假。
删除和删除的区别在于使用严格模式时:
"use strict";
let obj = Object.freeze({ prop: "value" });
Reflect.deleteProperty(obj, "prop"); // false
delete obj["prop"];
// TypeError: property "prop" is non-configurable and can't be deleted
正确的路
到2023年,你只能在一个线上做到这一点:
delete myObject.regex;
或
delete myObject["regex"];
(例如,如果你有一个对象obj与一个属性称为关键一,你不能做obj.key一,所以这里是obj(“关键一”)。