2015-08-28 42 views
3

我想删除一个对象的属性,但属性没有得到根本删...的Javascript删除object.property不工作

我有什么:

var tagFound = yield tags.findById(this.params.tagId); 
debug('prior delete: %j', tagFound); 
delete tagFound.password; 
debug('after delete: %j', tagFound); 

我得到什么:

api_v1 prior delete: {"_id":"55e064e9727b44c32a262c0f","expires":"2015-08-29T13:40:57.673Z","password":"$2a$08$hucJyHIU5gholAB1L.wVKeFoTmvFho9xFiJAAvmwmtKphLuJ9Hq4K","type":"free","name":"teste","__v":0,"visible":true,"locations":[{"latitude":65.9667,"longitude":-18.5333,"_id":"55e064e9727b44c32a262c10","timestamp":"2015-08-28T13:40:57.572Z"}]} 

api_v1 after delete: {"_id":"55e064e9727b44c32a262c0f","expires":"2015-08-29T13:40:57.673Z","password":"$2a$08$hucJyHIU5gholAB1L.wVKeFoTmvFho9xFiJAAvmwmtKphLuJ9Hq4K","type":"free","name":"teste","__v":0,"visible":true,"locations":[{"latitude":65.9667,"longitude":-18.5333,"_id":"55e064e9727b44c32a262c10","timestamp":"2015-08-28T13:40:57.572Z"}]} 

也许我的眼睛太累了,但我根本无法弄清楚这一点,有没有人看到明显的我在这里失踪的东西?

更新:我把这个放入http://jsfiddle.net/fc8mohwp/,问题是,它在那里工作,但不在这里(iojs)。应该有什么区别吗?

+1

'delete'返回什么? – vault

+1

'tagFound'从哪里来?如果密码字段来自HTML标签而不能删除。只有用户定义的属性才能被删除。至少在浏览器中就是这种情况,但可能类似的情况发生在节点中。 –

+0

删除返回true。 tagFound来自mongoDB文档 – rbaprado

回答

2

取决于声明方式的上下文,某些变量不能被删除。例如,您不能删除已在全局范围内定义的变量。

我讨厌发布一个链接的答案,但这篇博客文章描述了使用delete的所有规则和边缘案例。这是相当多的对我来说,在包括SO发布

Using delete in Javascript

+0

tagFound在本地声明,但它来自一个yield语句,这可能是问题吗? – rbaprado

+0

@rbaprado可能。 tags.findById来自哪里?这是你试图删除的DOM元素吗? – tier1

+0

tags.findById是mongoose的findOne的封装,这里没有DOM – rbaprado

1

这可能对例如密码字段不能更改或密码字段从原型链未来的多种原因。

您可以通过使用delete操作

删除myObject.proportyname与Object.getOwnPropertyDescriptor(tagFound, 'password');

+0

它返回undefined – rbaprado

+1

然后它来自原型。 –

-3

调试此您可以从一个JavaScript对象删除属性;

+0

删除是一个操作符,而不是一个函数。因此,这应该是'删除myObject.propertyname' – Rob