Деструктуризация и назначение объекта - PullRequest
3 голосов
/ 17 апреля 2019

У меня есть объект, json, и я хочу присвоить некоторым его свойств другому объекту, stn.

stn.closingTime = json.closingTime
stn.contactEmail = json.contactEmail
stn.contactPhone = json.contactPhone
stn.openingTime = json.openingTime
stn.priceFrom = json.priceFrom
stn.priceTo = json.priceTo

Я знаю, если бы я хотел просто иметь эти свойства в контексте глобального объекта, я мог бы сделать

{closingTime, contactEmail, contactPhone, etc....} = json

Но как мне деструктурировать эти свойства до другого именованного объекта? (stn в данном случае)

Ответы [ 6 ]

1 голос
/ 17 апреля 2019

Вы можете создать массив keys, который вам нужен, в stn. Затем используйте Object.fromEntries() так:

Object.fromEntries(keys.map(k => [k, json[k]]))

Демо-версия:

const input = {
  closingTime: 'closing',
  contactEmail: 'Email',
  contactPhone: 'Phone',
  openingTime: 'Time',
  priceFrom: 'From',
  priceTo: 'To'
};

const getPartial = (obj, keys) => Object.fromEntries(keys.map(k => [k, obj[k]]))

console.log(getPartial(input, ['closingTime', 'contactEmail' ]))
console.log(getPartial(input, ['contactPhone', 'priceFrom', 'priceTo' ]))
1 голос
/ 17 апреля 2019

Вы можете создать функцию и использовать Разрушение параметров функции. Ниже приведен пример кода, который получает a и b prop от obj.

const obj = {a:'a',b:'b',c:'c'};
const stn = (({a,b}) => ({a,b}))(obj)
console.log(stn)
1 голос
/ 17 апреля 2019

Попробуйте это:

const json = { closingTime: 'closingTime', contactEmail: 'contactEmail', contactPhone: 'contactPhone', openingTime: 'openingTime', priceFrom: 'priceFrom', priceTo: 'priceTo' };
const {
  contactPhone,
  openingTime,
  priceFrom,
  ...rest } = json;

const stn = {
  contactPhone,
  openingTime,
  priceFrom,
};
console.log(stn);
0 голосов
/ 17 апреля 2019

Вы можете создать функцию pickBy, которая создает новый объект из списка объектов. Сократите массив ключей до нового объекта, проверив, существует ли исходный объект, и добавьте его, а также его значение для накопленного объекта.

const input = {
  closingTime: 'closing',
  contactEmail: 'Email',
  contactPhone: 'Phone',
  openingTime: 'Time',
  priceFrom: 'From',
  priceTo: 'To'
}

const pickBy = (obj, keys) => keys.reduce((r, k) => k in obj ? { 
  ...r, [k]: obj[k] 
} : obj, {})

console.log(pickBy(input, ['closingTime', 'contactEmail']))
console.log(pickBy(input, ['contactPhone', 'priceFrom', 'priceTo']))

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

const input = {
  closingTime: 'closing',
  contactEmail: 'Email',
  contactPhone: 'Phone',
  openingTime: 'Time',
  priceFrom: 'From',
  priceTo: 'To'
}

const { closingTime, contactEmail, ...result } = input

console.log(result)
0 голосов
/ 17 апреля 2019

Вы можете использовать aliases, как это

// Grabs obj.x as as { otherName }
const { x: otherName } = obj;

Ссылка: https://davidwalsh.name/destructuring-alias

0 голосов
/ 17 апреля 2019

Если вы хотите скопировать все свойств из json, тогда вы можете использовать stn = {...json};.

Но так как вам нужно только скопировать некоторые свойств из json, тогда то, что вы делаете, в значительной степени является переходом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...