Вложенный частичный объект по умолчанию при деструктурировании в JS? - PullRequest
2 голосов
/ 18 октября 2019

Рассмотрим следующий код:

function foo({
    item1 = 'a',
    item2 = 'b',
    item3 = {x: 1, y: 2}
} = {}) {
    console.log(item1,item2,item3.x,item3.y)
}

Если вы позвоните foo(), вы получите объект со значениями по умолчанию для item1, item2 и item3. Вы также можете позвонить foo({item1: 'm', item2: 'n'}), и ваш результат будет включать item3 по умолчанию {x: 1, y: 2}. Однако, если вы позвоните:

foo({item1: 'm', item2: 'n', item3: {x: 99}})

, вы получите undefined для item3.y в области действия функции foo.

Итак:

Есть ли способ получить отдельные значения по умолчанию для вложенных свойств item3 в таком сценарии, как этот?

Ответы [ 3 ]

1 голос
/ 18 октября 2019

Да. Решение состоит в том, чтобы уничтожить больше. С:

function foo({
    item1 = 'a',
    item2 = 'b',
    item3 = {x: 1, y: 2}
} = {}) {
    console.log(item1,item2,item3.x,item3.y)
}

до

function foo({
    item1 = 'a',
    item2 = 'b',
    item3: {x = 1, y = 2} = {},
} = {}) {
    console.log(item1,item2,x,y)
}

К сожалению, существование item3 необходимо удалить, и можно использовать только x и y.

другое решение может быть только item3 = Object.assign({x: 1, y: 2}, item3) в качестве первой строки тела foo.

1 голос
/ 18 октября 2019

Есть хакерский способ достичь чего-то очень близкого. Вы можете объявить свойство, которое не будет отображаться в исходном объекте (item3ex), а затем использовать исходное свойство (item3), чтобы переопределить значения по умолчанию с распространением объекта.

function foo({
  item1 = 'a',
  item2 = 'b',
  item3,
  item3ex = { x: 1, y: 2, ...item3 } 
} = {}) {
  console.log(item1, item2, item3ex)
}

foo({item1: 'm', item2: 'n'})
foo({item1: 'm', item2: 'n', item3: {x: 99}})
1 голос
/ 18 октября 2019

Это невозможно.

В параметрах вы пытаетесь извлечь 3 переменные: объект item1, объект item2 и объект item3.

Кроме того, вы также пытаетесь видоизменить item3 объект в случае, если он не содержит определенного свойства.

Но все, что может сделать деструктуризация, это извлечь свойстваиз объекта в переменные - он не может видоизменить любые существующие объекты (без некоторого действительно уродливого дурацкого кода, который не должен использоваться).

Если вы в порядке, извлеките индивидуумаСвойства из item3 в новые переменные, вполне возможно, хотя:

function foo({
  item1 = 'a',
  item2 = 'b',
  item3: {
    x = 1,
    y = 2
  } = {}
} = {}) {
  console.log(item1, item2, x, y)
}


foo({item1: 'm', item2: 'n'})
foo({item1: 'm', item2: 'n', item3: {x: 99}})
...