Javascript删除对象属性不起作用

Posted

技术标签:

【中文标题】Javascript删除对象属性不起作用【英文标题】:Javascript delete object property not working 【发布时间】:2016-01-19 06:41:14 【问题描述】:

我正在 MEAN.js 上运行一些项目,但遇到以下问题。我想进行一些用户的个人资料计算并将其保存到数据库中。但是用户模型中的方法存在问题:

UserSchema.pre('save', function(next) 
    if (this.password && this.password.length > 6) 
        this.salt = new Buffer(crypto.randomBytes(16).toString('base64'), 'base64');
        this.password = this.hashPassword(this.password);
    
    next();
);

如果我将在我的更改中发送密码,它将更改凭据,因此用户下次无法登录。我想在保存之前从用户对象中删除密码,但我做不到(让我们看看下面代码中的 cmets):

exports.signin = function(req, res, next) 
    passport.authenticate('local', function(err, user, info) 
        if (err || !user) 
            res.status(400).send(info);
         else 
            /* Some calculations and user's object changes */
            req.login(user, function(err) 
                if(err) 
                    res.status(400).send(err);
                 else 
                    console.log(delete user.password); // returns true
                    console.log(user.password); // still returns password :(
                    //user.save();
                    //res.json(user);
                
            );
        
    )(req, res, next);
;

怎么了?为什么delete方法返回true,但是什么也没发生?谢谢你的帮助:)

【问题讨论】:

非严格模式删除即使属性无法删除也会返回true。同样delete在通过原型链获取属性时也会返回true,没有效果。 'use strict'; 是我的控制器文件的第一行。但是如何删除密码属性? 这似乎不太可能,但您是否检查过password 属性是否实际上是user 对象的属性并且不是来自原型链上的某个人(hasOwnProperty)?将其设置为 undefined 还不够(抱歉,没有平均堆栈的经验)?就 json 编码而言,结果应该没有区别。 不,将属性设置为 undefined 不起作用 ... hasOwnProperty 返回 false,正如您所料 【参考方案1】:

只要做:

user.password = undefined;

代替:

delete user.password;

密码属性不会出现在输出中。

【讨论】:

这在很多情况下肯定会导致意想不到的结果 @E.A.T,这家伙真的不需要删除密码属性。根据他上面的描述,他只是想在输出 JSON 中排除密码的值,只需将密码属性设为未定义,您就可以解决这个问题。试试看。 没有@lemueladane,他想在调用user.save() 时避免覆盖密码,如果设置为undefinednull 仍可能发生这种情况。我们没有足够的关于方法或任何 presave 钩子的信息。 @E.A.T,所以我猜,他需要先 user.save() 然后 user.password = undefined 然后 res.json(user)。【参考方案2】:

javascript中删除操作符有一定的规则

    如果属性是“严格模式”下自己的不可配置属性,则返回 false。

例如

x = 42;         // creates the property x on the global object
var y = 43;     // creates the property y on the global object, and marks it as non-configurable

// x is a property of the global object and can be deleted
delete x;       // returns true

// y is not configurable, so it cannot be deleted                
delete y;       // returns false 
    如果对象继承了原型的属性,并且本身没有该属性,则无法通过引用该对象来删除该属性。但是,您可以直接在原型上删除它。

例如

function Foo()
Foo.prototype.bar = 42;
var foo = new Foo();

// returns true, but with no effect, 
// since bar is an inherited property
delete foo.bar;           

// logs 42, property still inherited
console.log(foo.bar);

所以,请交叉检查这些点,有关更多信息,您可以阅读此Link

【讨论】:

【参考方案3】:

遇到了类似的问题。这对我有用:

// create a new copy  
let newUser= (...user._doc); 

// delete the copy and use newUser that thereafter. 
delete newUser.password; 

【讨论】:

【参考方案4】:

上面来自 Majed A 的答案是适用于单个对象属性的最简单的解决方案,我们甚至可以通过移除 ...user 扩展器使其更容易。只需从您的 object._doc 子对象中删除该属性。在您的示例中应该是:

user.save()
delete user._doc.password
res.status(201).json(user) // The password will not be shown in JSON but it has been saved.

【讨论】:

【参考方案5】:

有类似的问题。在特定情况下尝试从对象中删除属性时,delete 运算符“不起作用”。使用Lodash unset 修复它:

_.unset(user, "password");

https://lodash.com/docs/4.17.11#unset

否则delete 运算符确实有效。以防万一,delete 操作员文档在这里:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete

【讨论】:

以上是关于Javascript删除对象属性不起作用的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript排序数组不起作用

javascript array.includes在反应中不起作用

JavaFX 属性删除侦听器不起作用

Parse Server Javascript 支持嵌套 select() 调用不起作用

本机 Javascript - 如果语句不起作用,则具有 else 属性

javascript $(window).width() 属性在 Internet Explorer 中不起作用