【问题标题】:Delete a property from an object without creating a new one (No delete operateur)从对象中删除属性而不创建新属性(无删除操作)
【发布时间】:2018-02-03 11:56:01
【问题描述】:

以 Lodash omit 为例,用这段代码删除对象的属性:

this.current.obj = omit(this.current.obj, ['sellerSupportWeb', 'sellerSupportAgency', 'sellerSupportAgent'])

但这会创建另一个对象this.current.obj,但在我的情况下,我需要保留相同的对象

您有其他解决方案吗?但不是delete 运算符

【问题讨论】:

  • “需要保留同一个对象”是什么意思?您需要对象 - 旧对象(带有属性)和新对象(没有属性)?

标签: javascript object ecmascript-6 lodash


【解决方案1】:

您可以使用 lodash 的 _.unset() 从对象中删除属性:

var obj = { a: 1, b: 2, c: 3 };

_.unset(obj, 'a');

console.log(obj);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

【讨论】:

    【解决方案2】:

    您有其他解决方案吗?但不是delete 运算符

    不。您的选择是创建一个仅包含您想要的属性的新对象,或者使用 delete 运算符从现有对象中删除该属性(这可能会对属性查找性能产生重大影响,尽管这是否真的重要取决于如何通常你会使用该对象的属性)。

    好的,从技术上讲,您可以将 Proxy 对象包裹在原始对象周围,并使用 hasownKeysget 等挂钩来假装该属性不存在。但是您必须通过代理访问它。

    【讨论】:

      【解决方案3】:

      没有。没有替代解决方案。我强烈建议使用纯函数方法:不要修改变量,而是转换它们并创建新变量。如果您需要保留相同的对象(相同的内存分配),那么delete 运算符是您唯一的选择。

      【讨论】:

        【解决方案4】:

        您可以将属性设置为未定义,然后当您尝试访问它时,结果将与该属性不存在时的结果相同。

        myObject = {
            myProp = 'myValue'
        }
        
        myObject.myProp = undefined;
        console.log(myObject.myProp);
        console.log(myObject.inexistentProp);
        

        【讨论】:

          猜你喜欢
          • 2016-11-29
          • 1970-01-01
          • 1970-01-01
          • 2010-09-17
          • 1970-01-01
          • 2017-06-26
          相关资源
          最近更新 更多