【问题标题】:How to delete inherited objects values in Javascript?如何在Javascript中删除继承的对象值?
【发布时间】:2018-11-27 00:21:22
【问题描述】:

我在 Nodejs 中从数据库(使用 Mongoose 的 Mongodb)获取用户结果。 现在我想删除用户结果中的一些键。但无法删除其属性。 找了好多次都没找到删除的办法

例子:-

文件1.js 通过 mongo 查询获取用户

userModel.findOne(query, projection)
      .then(function (result) {
          if (result)
              return result;
          return false
      })

上述查询从数据库中获取结果,结果如下所示

user = {
 f_name: "Vikas",
 l_name: "Kohli",
 key1: "abcD",
 key2: "dhdhdh"

}

文件2.js

user = {
     f_name: "Vikas",
     l_name: "Kohli",
     key1: "abcD",
     key2: "dhdhdh"

    }
 inputuser = "dfdfhdfgy"

使用用户结果的key1创建用户密钥然后比较

(_.isEqual(userkey, user.key2)){
 //call to next file
}else{
//send response as key not matched
}

做一些逻辑,获取用户的密钥,然后使用 key2 做一些加密方法

最后将 key2 与 userResullt key 2(我从数据库中获取)进行比较 如果没问题,则传递到下一个函数

文件3.js 预期输出:-

user = {
         f_name: "Vikas",
         l_name: "Kohli"
        }

当前情景:-

user = {
         f_name: "Vikas",
         l_name: "Kohli",
         key1: "abcD"
         key2: "dhdhdh"

        }

现在想要发送带有已删除键 1 和键 2 的用户结果的响应,但无法删除该键

delete 关键字不会删除继承的属性,但是如果你删除一个原型属性,它会影响从原型继承的所有对象。 (来自 w3schools,developer.mozilla)

还找到了一些有用的链接,但没有一个对我有用。我怎样才能做到这一点?

Clarification on the inability of javascript deleting inherited properties.

Why delete operator returns true even if property wasn't deleted from an object

【问题讨论】:

  • 对于一些简单的东西来说太长了。 delete key 不工作吗?
  • 一点也不。即使它显示为 true 但无法删除该键,因为该对象是继承的
  • 您可以删除/覆盖具有相同名称的对象的自身属性,但不能删除继承的属性,除非您想从原型本身中删除它们。通常的解决方法是在引用属性时检查hasOwnProperty。或者,您可以制作对象的深层副本,并仅包含您需要的属性。
  • 问题缺少stackoverflow.com/help/mcve。应该有一些代码来解释这些对象是如何产生的,以及delete 是如何产生的。问题没有解释这一点,也没有显示继承。

标签: javascript node.js object delete-operator inherited


【解决方案1】:

delete在mongoose返回的模型上不起作用,但转换为object后可以删除。

user = user.toObject();
delete user.key1;
delete user.key2;

【讨论】:

    【解决方案2】:

    您可以从现有对象创建一个新对象,并获取您需要的属性:

    let user = {
        f_name: "Vikas",
        l_name: "Kohli",
        key1: "abcD",
        key2: "dhdhdh"
    }
    
    user = (({f_name, l_name}) => ({f_name, l_name}))(user);
    
    console.log(user);

    如果您有很多属性要保留,而只有少数要拒绝,那么您可以像这样列出要拒绝的属性:

    let user = {
        f_name: "Vikas",
        l_name: "Kohli",
        key1: "abcD",
        key2: "dhdhdh"
    }
    
    const reject = new Set(["key1", "key2"]);
    user = Object.assign(...Object.entries(user)
                                  .filter(([k,v]) => !reject.has(k))
                                  .map(([k,v]) => ({[k]: v})));
    
    console.log(user);

    【讨论】:

    • 这能回答你的问题吗?你能留下一些反馈吗?
    • 如果有100个属性,那么写100个我要发送的属性不好
    • 那么你有多少房产?您需要删除多少个属性?
    • 无论如何,我添加了一个替代方案,您需要指定要省略而不是保留的键列表。
    【解决方案3】:

    用户对象中存在逗号语法错误,更正并应用删除运算符

    user = {
     f_name: "Vikas",
     l_name: "Kohli",
     key1: "abcD",
     key2: "dhdhdh"
    }
    
    delete user.key1
    delete user.key2
    

    【讨论】:

    • 没有语法错误。错误地,我在这里写了一个语法错误。现在我变了
    猜你喜欢
    • 2012-01-31
    • 1970-01-01
    • 2013-07-20
    • 2019-01-30
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 2015-09-30
    • 1970-01-01
    相关资源
    最近更新 更多