Уменьшение и деконструкция / назначение объекта - PullRequest
0 голосов
/ 24 февраля 2020

Давайте предположим, что у меня есть два простых объекта, и я хочу создать третий, который будет объединять их свойства. Это прекрасно работает:

(()=>{
  const a1 = {a: 2, b: 3}
  const b1 = {a: 100, c: 5}
  return {...a1, ...b1}
})()
// { a: 100, b: 3, c: 5 }

Но перестает работать, когда я пытаюсь создать новый объект, полученный из b1, используя .reduce. Для простоты давайте создадим функцию приведения, которая просто делает поверхностную копию объекта b1:

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 есть что-то, чего я просто не понимаю. Что я могу сделать, чтобы это исправить?

Ответы [ 3 ]

2 голосов
/ 24 февраля 2020

По умолчанию свойства, созданные с помощью defineProperty, не перечисляются, поэтому они не будут включены в разворот.

Исправление:

b2 = Object.entries(b1).reduce((acc, [key, value]) =>
  Object.defineProperty(acc, key, {value, enumerable: true})
, {})
1 голос
/ 24 февраля 2020

Вы должны пометить свойство как перечисляемое

Object.defineProperty(acc, key, {value, enumerable: true});

Почему бы просто не использовать функцию 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 }
0 голосов
/ 24 февраля 2020

Одним из исправлений может быть использование 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 }
...