[英]Reduce and object deconstruction/assignment
假设我有两个简单的对象,我想创建第三个对象来加入它们的属性。 这非常有效:
(()=>{
const a1 = {a: 2, b: 3}
const b1 = {a: 100, c: 5}
return {...a1, ...b1}
})()
// { a: 100, b: 3, c: 5 }
但是一旦我尝试使用.reduce
创建一个从 b1 派生的新的 object ,它就会停止工作。 为了简单起见,让我们创建一个 reduce function,它只是制作 b1 object 的浅表副本:
let r = (()=>{ const a1 = {a: 2, b: 3} const b1 = {a: 100, c: 5}, b2 = Object.entries(b1).reduce((acc, [key, value])=>Object.defineProperty(acc, key, {value}), {}) console.log(b2) // {a: 100 c: 5} return {...a1, ...b2} })() console.log(r);// { a: 2, b: 3 }
我有一种感觉,关于.reduce
function 有一些我不明白的地方。 我该怎么做才能解决这个问题?
默认情况下,使用defineProperty
创建的属性是不可枚举的,因此它们不会包含在传播中。
修理:
b2 = Object.entries(b1).reduce((acc, [key, value]) =>
Object.defineProperty(acc, key, {value, enumerable: true})
, {})
您应该将该属性标记为可枚举
Object.defineProperty(acc, key, {value, enumerable: true});
为什么不直接使用 function Object.assign
,它很简单。
let r = (()=> { const a1 = {a: 2, b: 3}; const b1 = {a: 100, c: 5}; const b2 = Object.entries(b1).reduce((acc, [key, value]) => Object.assign(acc, {[key]: value}), {}) console.log(b2); // {a: 100 c: 5} return {...a1, ...b2} })() console.log(r); // { a: 2, b: 3 }
一种解决方法是使用Object.assign
创建b1
的副本,例如:
let r = (()=>{ const a1 = {a: 2, b: 3} const b1 = {a: 100, c: 5} const b2 = Object.assign({}, b1) console.log(b2) // {a: 100 c: 5} return {...a1, ...b2} })() console.log(r); // { a: 100, b: 3, c: 5 }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.