考虑到一个对象:
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"
};
当前回答
分布式合成(ES6)
要完成 Koen 的答案,如果您想使用扩散合成来删除动态变量,您可以这样做:
const key = 'a'; const { [key]: foo,...rest } = { a: 1, b: 2, c: 3 }; console.log(foo); // 1 console.log(rest); // { b: 2, c: 3 }
* foo 将是一个新的变量,值为 a(即 1)。
延伸答案
每个人都有自己的优点和缺点(查看此性能比较):
删除操作员
它是可读的和短暂的,但是,它可能不是最好的选择,如果你在大量的对象上运行,因为它的性能不优化。
delete obj[key];
重新分配
它比删除更快两倍,但财产不会被删除,并且可以被异化。
obj[key] = null;
obj[key] = false;
obj[key] = undefined;
扩展运营商
{ [key]: val, ...rest } = obj;
其他回答
丹的说法是“删除”是非常缓慢的,他发布的参考标志是怀疑的,所以我自己在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
请注意,我故意在一个旋转周期内进行了多个“删除”操作,以尽量减少其他操作所造成的效果。
Object.assign() 和 Object.keys() 和 Array.map()
const obj = { “过滤器”:[ { “过滤器类型”:”之间”, “区域”:”BasicInformationRow.A0”, “MaxValue”:”2017-10-01”, “MinValue”:”2017-09-01”, “值”:”过滤器值” } } }; let new_obj1 = Object.assign({}, obj.Filters[0]); let new_obj2 = Object.assign({}, obj.Filters[0]); /* // old version let sh
分布式合成(ES6)
要完成 Koen 的答案,如果您想使用扩散合成来删除动态变量,您可以这样做:
const key = 'a'; const { [key]: foo,...rest } = { a: 1, b: 2, c: 3 }; console.log(foo); // 1 console.log(rest); // { b: 2, c: 3 }
* foo 将是一个新的变量,值为 a(即 1)。
延伸答案
每个人都有自己的优点和缺点(查看此性能比较):
删除操作员
它是可读的和短暂的,但是,它可能不是最好的选择,如果你在大量的对象上运行,因为它的性能不优化。
delete obj[key];
重新分配
它比删除更快两倍,但财产不会被删除,并且可以被异化。
obj[key] = null;
obj[key] = false;
obj[key] = undefined;
扩展运营商
{ [key]: val, ...rest } = obj;
假设你有一个类似于此的对象:
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中,有2种常见方法可以从对象中删除属性。
第一個可轉換的方法是使用 delete object.property 運營商。
第二种方法是不可改变的,因为它不改变原始对象,是引用对象破坏和传播合成: const {财产,...rest} = 对象。