Разрушение JavaScript и присвоение новому объекту

#javascript #typescript #destructuring

#javascript #typescript #разрушение

Вопрос:

В JavaScript /Typescript,

Какова короткая версия для разрушения и последующего присвоения новому объекту, например :

 const payload: MyPayload = { a: 1, b: 2, c: 3, d: 4, e: 5 }

// Destruct
const { a, c, e } = payload;

// New Obj
const newPayload = {
  a, c, e
};
  

Ответ №1:

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

 const
    getParts = ({ a, c, e }) => ({ a, c, e }),
    payload = { a: 1, b: 2, c: 3, d: 4, e: 5 },
    parts = getParts(payload);

console.log(parts);  

Комментарии:

1. Я предполагаю, что это не будет компилироваться, если какой-либо из этих реквизитов является необязательным в MyPayload .

Ответ №2:

Вы можете использовать IIFE

 const payload = { a: 1, b: 2, c: 3, d: 4, e: 5 }

const obj = (({a,c,e}) => ({a,c,e}))(payload)

console.log(obj)  

Ответ №3:

Вы можете создать объект во время деструктурирования, используя object rest:

 const payload = { a: 1, b: 2, c: 3, d: 4, e: 5 }

const { b, d, ...newPayload } = payload

console.log(newPayload)  

Комментарии:

1. Это работает, только если вы знаете все ОСТАЛЬНЫЕ параметры. Не очень типичный вариант использования

2. На самом деле это стандартный вариант использования. Вы опускаете свойства для создания нового объекта, а иногда используете пропущенные свойства. Например, при разработке с React мы постоянно используем его для подготовки реквизита для дочерних элементов.

3. Это опасно в довольно большом количестве случаев. У вас нет защиты от добавления каких-либо других значений. Например. если вы фильтруете конфиденциальные поля из результата запроса к базе данных, прежде чем возвращать его в качестве http-ответа, все новые добавленные конфиденциальные поля останутся.