我有一个名为dictionary
的平面JavaScript对象,我想根据其他平面对象进行更新。有时我想将对象的每个属性添加到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' }
没有这样的内置函数,但是编写自己的函数来完成这样的事情是相当微不足道的:
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
函数添加到其中,但改变内置对象是非常糟糕的做法 - 最好做一个独立的函数(
我发现的另一种美丽的方法是通过对象解构...
const dictionary = { foo: 'bar', baz: 'qux', spam: 'spam' };
const {foo, baz, ...newDictionary} = dictionary;
console.log(newDictionary) // { spam: 'spam' }