如何用 objects.assign 组合对象?

How to combine objects with objects.assign?

我的简单代码

const ob1 = {
  a: 'pokushevski',
  b: '2001',
};

const obj2 = {
  obj1: {},
  c: '1999',
};

const result = Object.assign(ob1, obj2);
console.log(result);
console.log(Object.getOwnPropertyNames(result));

输出

{ a: 'pokushevski', b: '2001', obj1: {}, c: '1999' }
[ 'a', 'b', 'obj1', 'c' ]

结果中的 obj1 似乎与任何其他属性一样,没有任何对 const obj1 的引用。 为什么?

你现在所做的基本上是将 ob1(没有 'j')与 obj2(有 'j')合并,并且由于 obj1( 'j') 是 obj2 内的空对象,它作为 属性 添加到生成的合并对象上。

您还有什么期望,我们可以帮助您实现目标吗?

也许您实际上打错了字,想要将第一个对象 ob1 命名为 obj1,然后用作 obj2 中的 属性,最后合并两个对象?

如果是,你可以这样做:

const obj1 = {
  a: 'pokushevski',
  b: '2001',
};

const obj2 = {
  obj1, // shorthand syntax, property will be named the same as the const
  c: '1999',
};

// avoid mutation by using a new object as the target
const result = Object.assign({}, obj1, obj2);

// Display result and property names
console.log(result);
console.log(Object.getOwnPropertyNames(result));

如果您只想在 obj2 内添加 obj1,则不需要 Object.assign

注意可变因素

使用上面的代码,每当您更新 result.obj1 属性时,原始 obj1 都会被修改。尝试更新 result.obj1.a 然后 console.log(obj1)

如果你想避免这种情况,你可以像这样使用解构:

const obj1 = {
  a: 'pokushevski',
  b: '2001',
};

// Create a shallow copy of `obj1` to prevent mutating the original
// object by updating `obj2.obj1` properties
const obj2 = {
  obj1: {...obj1},
  c: '1999',
};

// Avoid mutating the original `obj1` by using a new object as the target
const result = Object.assign({}, obj1, obj2);

// Display result and property names
console.log(result);
console.log(Object.getOwnPropertyNames(result))

如果你真的想继续使用 Object.assign 而不是解构,你可以用 obj1: Object.assign({}, obj1)

替换 obj1: {...obj1}

我猜你想让 ob1 成为 obj2 中的 obj1

那么这是一种方法:

const ob1 = {
  a: 'pokushevski',
  b: '2001',
};

const obj2 = {
  obj1: {},
  c: '1999',
};

const result = Object.assign({}, obj2);
Object.assign(result.obj1, ob1);
console.log(result);
console.log(Object.getOwnPropertyNames(result));