JavaScript';s`delete`运算符未按预期工作
我有一个对象如下:JavaScript';s`delete`运算符未按预期工作,javascript,Javascript,我有一个对象如下: var doc = { local: { username: 'admin', status: true, password: '$2a$08$81Kq7/59ZASHl5k9n5cNvOUSl/HYgpLKZjs66P/OJV8vw.nHW60Ta', lastname: 'admin', firstname: 'admin', email: 'admin@gmail.com', datetime_modified
var doc = {
local: {
username: 'admin',
status: true,
password: '$2a$08$81Kq7/59ZASHl5k9n5cNvOUSl/HYgpLKZjs66P/OJV8vw.nHW60Ta',
lastname: 'admin',
firstname: 'admin',
email: 'admin@gmail.com',
datetime_modified: 'TueAug30201623: 10: 56GMT+0530(IST)',
datetime_created: 'MonAug29201622: 34: 12GMT+0530(IST)'
},
roles: [
'ADMIN',
'HR'
],
GridOrder: [
{
_id: '57e507fce94094be085425c9',
domainName: 'items'
}
],
_id: '57c46b0c12907af910167ff5',
__v: 9
}
delete doc.GridOrder
现在我想从“doc”中删除属性“GridOrder”。
我尝试使用“删除”,如下所示:
var doc = {
local: {
username: 'admin',
status: true,
password: '$2a$08$81Kq7/59ZASHl5k9n5cNvOUSl/HYgpLKZjs66P/OJV8vw.nHW60Ta',
lastname: 'admin',
firstname: 'admin',
email: 'admin@gmail.com',
datetime_modified: 'TueAug30201623: 10: 56GMT+0530(IST)',
datetime_created: 'MonAug29201622: 34: 12GMT+0530(IST)'
},
roles: [
'ADMIN',
'HR'
],
GridOrder: [
{
_id: '57e507fce94094be085425c9',
domainName: 'items'
}
],
_id: '57c46b0c12907af910167ff5',
__v: 9
}
delete doc.GridOrder
也如以下所示:
delete doc['GridOrder']
但什么都没有发生。我也没有得到任何错误
如何从“文档”中删除“GridOrder”。有什么想法吗?确认您有权访问正确的
对象
,只需使用删除
var doc={
本地:{
用户名:“admin”,
状态:正确,
密码:“$2a$08$81Kq7/59ZASHl5k9n5cNvOUSl/HYgpLKZjs66P/OJV8vw.nHW60Ta”,
lastname:'管理员',
名字:'管理员',
电邮:'admin@gmail.com',
修改日期时间:“TueAug30201623:10:56GMT+0530(IST)”,
datetime_created:'MonAug29201622:34:12GMT+0530(IST)'
},
角色:[
“管理员”,
“人力资源”
],
GridOrder:[
{
_id:'57e507fce94094be085425c9',
域名:'items'
}
],
_id:'57c46b0c12907af910167ff5',
__v:9
}
删除doc.GridOrder;
console.log('doc.GridOrder',doc.GridOrder)
console.log(doc)
使对象属性可配置
在使用上述代码时,您的最小示例可以按预期工作
根据您的评论,GridOrder
实际上是用定义的,默认情况下,它会创建不可配置(读取:不可删除)的属性
定义属性时,只需将configurable:true
传递给Object.defineProperty
var doc={
本地:{
用户名:“admin”,
状态:正确,
密码:“$2a$08$81Kq7/59ZASHl5k9n5cNvOUSl/HYgpLKZjs66P/OJV8vw.nHW60Ta”,
lastname:'管理员',
名字:'管理员',
电邮:'admin@gmail.com',
修改日期时间:“TueAug30201623:10:56GMT+0530(IST)”,
datetime_created:'MonAug29201622:34:12GMT+0530(IST)'
},
角色:[
“管理员”,
“人力资源”
],
_id:'57c46b0c12907af910167ff5',
__v:9
}
//除非将“可配置”设置为“true”,否则无法删除以这种方式定义的对象`
Object.defineProperty(
博士,
“GridOrder”,
{
可配置:true,//默认为`false`
价值:[
{
_id:'57e507fce94094be085425c9',
域名:'items'
}
]
}
);
log('doc.GridOrder:',doc.GridOrder);
log('delete doc.GridOrder:',delete doc.GridOrder:');
log('doc.GridOrder:',doc.GridOrder)代码>您应该在严格模式下运行代码,在这种情况下,删除失败将导致运行时错误,从而更容易发现:
未捕获的TypeError:无法删除#(…)的属性“foo”`
如果你真的想,那也可以捕捉它
在sloppy模式下,delete
操作符在失败时将返回false,因此您可以检查其值以帮助了解发生了什么。根据MDN文档:
true
对于所有情况,除非属性是自己的不可配置属性,在这种情况下,false
以非严格模式返回
请注意,属性不存在是返回false
或失败的原因
一位评论员声称:
是否也是对象的原型链上存在的属性?在这两种情况下,删除都将失败
否,原型上的属性将不导致删除失败。它将成功(意味着不抛出,也不返回false
),但不执行任何操作。delete doc.GridOrder
应该可以工作。js也将它们称为“对象”,而不是“hashmaps”。这在使用上述代码时可以正常工作。a)GridOrder
是否可能是使用对象定义的。defineProperty()
或b)GridOrder
也是对象原型链上存在的属性?在这两种情况下,delete
都将失败*看:@gfullam我认为你在这个问题上是对的。它被定义为“a”。有没有关于如何删除它的建议?。你也可以把上面的评论作为一个答案吗?@ArunMohan不知道你是如何定义它的,你可以做一些类似于Object.defineProperty(doc,'GridOrder',{configurable:true})
,这将使你能够以你试图做的方式删除它。查看更多信息information@gfullam我的意思是,他在哪里调用defineProperty
他应该将其更新为如果可能的话,而不是将“正确”答案作为“编辑”,你应该用新答案替换你以前的答案。@torazaburovalue
默认为未定义。