Использование фигурных скобок ES6 при извлечении из объекта и назначении другому объекту

Я хотел бы использовать фигурные скобки, чтобы заменить этот код:

let rUsers = children.map((user) => {
    let rUser= {};
    rUser.firstName = user.firstName;
    rUser.lastName = user.lastName;
    rUser.relation = user.patron.relation;
    return rUser;
 });

Вот что у меня есть:

let rUsers = children.map((user) => {
    let rUser = {};
    ({
        firstName: rUser.firstName,
        lastName: rUser.lastName,
        patron.relation: rUser.relation, // I get an error here
    } = user);
    return rUser;
}

За исключением патрон.отношения, остальная добыча работает.

Вопросы:

  1. Как мне извлечь значение user.patron.relation?
  2. Есть ли более краткий способ написать выше?

Спасибо!


person fab    schedule 16.11.2017    source источник


Ответы (3)


Как мне извлечь значение user.patron.relation?

Вы бы использовали { … patron: {relation: rUser.relation}, … } в качестве цели деструктурирования.

Есть ли более краткий способ написать выше?

Если имена свойств не совпадают, вы мало что можете сделать, но в вашем конкретном случае вы можете упростить, разрушив структуру параметр в несколько переменных:

const rUsers = children.map(({firstName, lastName, patron: {relation}}) => 
    ({firstName, lastName, relation})
);
person Bergi    schedule 16.11.2017
comment
Спасибо @Bergi за ответы на оба вопроса! Работал хорошо! В случаях, когда свойства нельзя передать в качестве параметров, как бы вы извлекли определенные свойства из одного объекта и присвоили их другому объекту? - person fab; 17.11.2017
comment
@fab Что вы подразумеваете под свойствами, которые нельзя передавать в качестве параметров? - person Bergi; 17.11.2017
comment
в приведенном выше примере мы смогли получить доступ к методу map() массива и передать свойства объекта в качестве параметров. Что если есть объект user: let user = { firstname: 'Aldrin', lastname: 'Theo', patron: { relation: 'Spouse' } } и мы хотим извлечь firstname и patron.relation в объект reducedUser. Как бы вы это разрушили? - person fab; 17.11.2017
comment
@fab Либо просто деструктурируйте в let/const, а затем создайте объект, либо сделайте все в одном выражении IIFE (с параметрами :-П) - person Bergi; 17.11.2017
comment
Хорошо. Спасибо @Bergi! - person fab; 18.11.2017

Вы можете использовать деструктурирование объекта следующим образом:

const {firstName, lastName, patron: {relation}} = user

И relation было установлено значение user.patron.relation.

Вы можете вернуть объект, который хотите, так:

return {firstName, lastName, relation}
person gunn    schedule 16.11.2017

Я вижу несколько неправильных вещей в вашем коде.

  1. patron.relation -> patron не определено и не может использоваться в качестве ключа.
  2. Во втором примере используется rUser — я думаю, вам просто нужно user.

Насколько я понимаю, что вы пытаетесь сделать, по сути, создать клон? Если это так, вы должны быть в состоянии сделать что-то вроде этого.

let rUsers = children.map(user => {
    firstName: user.firstName,
    lastName: user.lastName,
    relation: user.relation
});

В качестве альтернативы может быть проще использовать Object.assign()

let rUsers = children.map(user => Object.assign({}, user));
person jhpratt    schedule 16.11.2017