首页 > 解决方案 > JavaScript Object.assign 的逆

问题描述

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

这个问题,我知道如何合并属性(例如,使用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' }

标签: javascriptjavascript-objects

解决方案


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

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函数,但改变内置对象是非常糟糕的做法 - 最好制作一个独立函数)


推荐阅读