【问题标题】:Inverse of JavaScript Object.assignJavaScript Object.assign 的逆
【发布时间】:2018-07-01 22:25:56
【问题描述】:

我有一个名为 dictionary 的平面 JavaScript 对象,我想根据其他平面对象对其进行更新。有时我想将对象的每个属性添加到dictionary,有时我想删除dictionary 中存在于另一个对象中的每个键。稍后我将使用这些属性的值,但为了管理 dictionary,我只关心它们的名称。

this 的问题,我知道如何合并属性(例如,使用Object.assign)。我怎样才能做到这一点呢? Object.unassign 不存在,但有类似的吗?

例如:

dictionary = { foo: 'bar', baz: 'qux' };
object1 = { spam: 'spam' };

Object.assign(dictionary, object1); // dictionary now has properties: foo, baz, spam

object2 = { foo: 'spam', baz: 'qux' };

Object.unassign(dictionary, object2); // dictionary is now only { spam: 'spam' }

【问题讨论】:

    标签: javascript javascript-objects


    【解决方案1】:

    没有这样的内置函数,但是编写自己的函数来完成类似的事情会很简单:

    const dictionary = { foo: 'bar', baz: 'qux' };
    const object1 = { spam: 'spam' };
    const object2 = { foo: 'spam', baz: 'qux' };
    
    Object.assign(dictionary, object1);
    
    const unassign = (target, source) => {
      Object.keys(source).forEach(key => {
        delete target[key];
      });
    };
    unassign(dictionary, object2);
    console.log(dictionary);

    (虽然您可以更改 Object.prototype 并将此 unassign 函数添加到其中,但改变内置对象是非常不好的做法 - 最好制作一个独立功能)

    【讨论】:

      【解决方案2】:

      我发现的另一种漂亮的方法是通过对象解构......

      const dictionary = { foo: 'bar', baz: 'qux', spam: 'spam' };
      const {foo, baz, ...newDictionary} = dictionary;
      console.log(newDictionary) // { spam: 'spam' }

      【讨论】:

        猜你喜欢
        • 2012-07-25
        • 1970-01-01
        • 1970-01-01
        • 2021-09-09
        • 2017-03-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多