JavaScript Object.assign的逆函数

时间:2018-07-01 22:25:56

标签: javascript javascript-objects

我有一个名为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' }

2 个答案:

答案 0 :(得分:5)

没有这样的内置函数,但是编写自己的函数来完成这样的事情将是微不足道的:

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函数,但是对内置对象进行变异是非常的错误做法-更好地制作独立功能)

答案 1 :(得分:0)

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

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