Почему Object.assign не заменяет ключ в моем новом объекте? - PullRequest
0 голосов
/ 05 марта 2019

Функция handleSave

@bind
private handleSave() {
  const { coin, balance } = this.state;
  console.log('coin', coin);
  console.log('balance', balance);

  const updatedCoin = Object.assign({
    ...coin,
    position: balance
  }, coin);

  console.log('updatedCoin', updatedCoin);
  this.props.updateCoinPortfolio(updatedCoin);
  this.props.toggle(false);
}

В первом файле console.log coin находится следующий объект:

{
  availableSupply: "17572412",
  currency: "BTC",
  exchange: "",
  exchange_base: "",
  marketCap: 67651096742.34,
  name: "Bitcoin",
  percentage: 100,
  position: 1,
  price: "3849.84695",
  value: 3849.84695
}

А balance = 2

Далее в этом журнале: console.log('updatedCoin', updatedCoin); Я ожидаю, что положение монеты теперь будет 2, а не 1. Но это все еще 1?

a

Object.assign часть:

const updatedCoin = Object.assign({
  ...coin,
  position: balance
}, coin);

Ответы [ 4 ]

2 голосов
/ 05 марта 2019

Вам нужно сделать так:

const updatedCoin = Object.assign ({... coin, position: balance}, {});

или более просто:

const updatedCoin = {... coin, position: balance}

2 голосов
/ 05 марта 2019

Вы смешиваете метафоры. Вы либо хотите assign:

const updatedCoin = Object.assign({}, coin, {position: balance});

или имущественное распространение:

const updatedCoin = {
  ...coin,
  position: balance
};

Ваш код assign не работал, потому что вы поставили coin после объекта, который вы обновили, поэтому position был перезаписан с coin. (С assign - и распространением & mdash; побеждает последний.)

1 голос
/ 05 марта 2019

Просто сделай:

const updatedCoin = {
  ...coin,
  position: balance
}

С вашим кодом вы сначала объединяете coin с {position: balance}, но затем с assign вы перезаписываете {position: balance} значением coin для position.

1 голос
/ 05 марта 2019

Вам нужно использовать его таким образом, чтобы он заработал:

const updatedCoin = Object.assign({}, coin, {position: balance});

Как вы его использовали, вы сначала генерируете объект с оригинальным объектом монеты плюс обновленную позицию.Этого будет достаточно, чтобы получить обновленный объект, как показано в следующем примере:

let coin = {
  availableSupply: "17572412",
  currency: "BTC",
  exchange: "",
  exchange_base: "",
  marketCap: 67651096742.34,
  name: "Bitcoin",
  percentage: 100,
  position: 1,
  price: "3849.84695",
  value: 3849.84695
}

console.log({...coin, position: 2});
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}

Но позже и, наконец, вы присваиваете все исходные свойства монеты обновленному объекту, возвращая свой начальный объект:

let coin = {
  availableSupply: "17572412",
  currency: "BTC",
  exchange: "",
  exchange_base: "",
  marketCap: 67651096742.34,
  name: "Bitcoin",
  percentage: 100,
  position: 1,
  price: "3849.84695",
  value: 3849.84695
}

let updated = {...coin, position: 2};
console.log(Object.assign(updated, coin));
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...