Можно ли деструктурировать некоторые свойства, а также назначить / передать весь объект в одном выражении присваивания функции обратного вызова карты? - PullRequest
2 голосов
/ 19 апреля 2020

Например, скажем, я сопоставляю массив объектов:

arrayOfPeople.map( ({ firstname, lastname }) => {
  // 2 variables scoped here: firstname, lastname
})

Я понимаю, что мог (аналогичным образом) сделать следующее:

arrayOfPeople.map(person => {
  const { firstname, lastname } = person
  // except now I actually have 3 variables scoped here: person, firstname, lastname
})

Есть ли синтаксис для назначения всех 3 переменных (то есть как свойств, так и всего объекта), как во втором примере, но где назначения / деструктуризация происходят внутри скобок, где параметры ?

Возможно , что-то вроде этого:

arrayOfPeople.map( ({ person = { /* ...entireObject */ }, firstname, lastname }) => {
 // 3 variables scoped here: person, firstname, lastname
})

Я понимаю, что это разница одной строки кода, но мне любопытно, если это возможно.

Спасибо

РЕДАКТИРОВАТЬ: просто чтобы уточнить, объекты, отображаемые в массиве (то есть "персона") имеет больше свойств, чем просто имя и фамилия, и я хочу получить доступ ко всему объекту, включая имя и фамилию.

1 Ответ

0 голосов
/ 21 апреля 2020

Там нет способа получить объект таким, какой он есть, и деструктурировать его одним оператором.

Но, если вам нужны только его неструктурированные свойства, а не деструктурированные, прототип объекта, et c .; тогда вы можете использовать синтаксис остальных (используя знакомую нотацию ...):

arrayOfPeople.map( ({ firstname, lastname, ...rest}) => {
  // 3 variables scoped here: firstname, lastname, rest
})

Проверьте это здесь:

const original = {
  foo: 1,
  bar: 2,
  get baz(){
    return 3
  }
}

const {
  foo,
  ...rest
} = original

console.log(foo)      //1
console.log(rest.bar) //2

console.log(rest.foo) //undefined - it has been destructured
console.log(Object.getOwnPropertyDescriptor(rest, 'baz')) //No longer a getter
/* Just to make console fill the available space */
.as-console-wrapper{ max-height: 100% !important; }
...