Использование Object.assign на объекте внутри объекта - PullRequest
0 голосов
/ 13 мая 2018

Как использовать Object.assign для обновления второго объекта в массиве allMsgs?

У меня есть:

let v = {
  allMsgs: [
    {
        a: 111,
        b: [],
    },

    {
        a: 222,
        b: [],
    }
  ]
}

Я хочу получить копию v, чтобы она была:

let v = {
  allMsgs: [
    {
        a: 111,
        b: [],
    },

    {
        a: 222,
        b: ['newItem],
    }
  ]
}

Как мне использовать Object.assign для этого?

Ответы [ 3 ]

0 голосов
/ 13 мая 2018

Если цель не состоит в том, чтобы изменить исходный объект, то вы бы сделали это следующим образом:

let v = {
  allMsgs: [
    { a: 111, b: [] }, 
    { a: 222, b: [] }
  ]
};

let w = { allMsgs: Object.assign([...v.allMsgs], 
           { 1: Object.assign({}, v.allMsgs[1], 
               {b: ['newItem']} 
           )}
        )};

console.log('updated =', w);
console.log('original =', v);

Обратите внимание, что здесь первый объект в allMsgs все еще используется двумя объектами.Только тот, который вы хотели изменить, является (очевидно) отдельным.

В библиотеках, подобных immutable.js, есть хорошие методы для создания таких обновлений с использованием краткого синтаксиса.

0 голосов
/ 13 мая 2018

Без Object.assign вы можете обратиться к массиву напрямую и нажать значение.

var v = { allMsgs: [{ a: 111, b: [] }, { a: 222, b: [] }] };

v.allMsgs[1].b.push('newItem');

console.log(v);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 13 мая 2018

Просто выберите деталь, которую хотите обновить

let v = {
  allMsgs: [
    {
        a: 111,
        b: [],
    },

    {
        a: 222,
        b: [],
    }
  ]
};
 let vCopy = { allMsgs: v.allMsgs.map(msg => Object.assign({}, msg))};
vCopy.allMsgs[1] = Object.assign(vCopy.allMsgs[1], { b: ['newItem'] });

console.log('copy', vCopy);
console.log('actual', v);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...