Назначение объекта создает неопределенную переменную

1

Поэтому я использовал Object.assign() раньше, с некоторым успехом. Однако сейчас у меня проблемы. У меня есть объект:

let stats = {
      rounds: 0,
      userHits: 0,
      userDmgDelt: 0,
      userDmgTaken: 0,
      userCrits: 0,
      userMiss: 0,
      userDodge: 0,
      mobHits: 0,
      mobDmgDelt: 0,
      mobDmgTaken: 0,
      mobCrits: 0,
      mobMiss: 0,
      mobDodge: 0,
    };

Затем я пытаюсь сделать это:

stats = Object.assign(stats, {
    userMiss: userMiss++,
});

Я думал, что использование объекта внутри функции определит его по его старому значению, которое будет равно 0. Я хотел не использовать длинные блоки stats.Stat += 1 а что нет.

  • 0
    Как бы выглядели эти длинные блоки? В какой ситуации все эти характеристики увеличиваются одновременно?
Теги:

4 ответа

1

userMiss не является отдельной переменной, поэтому выражение userMiss++ не будет работать. Если вы хотите использовать Object.assign, вам придется использовать

let stats = {
  rounds: 0,
  userHits: 0,
  userDmgDelt: 0,
  userDmgTaken: 0,
  userCrits: 0,
  userMiss: 0,
  userDodge: 0,
  mobHits: 0,
  mobDmgDelt: 0,
  mobDmgTaken: 0,
  mobCrits: 0,
  mobMiss: 0,
  mobDodge: 0,
};
stats = Object.assign(stats, {
  userMiss: stats.userMiss + 1,
});
console.log(stats);

но почему бы не просто Object.assign свойство, избегая Object.assign вообще?

let stats = {
  rounds: 0,
  userHits: 0,
  userDmgDelt: 0,
  userDmgTaken: 0,
  userCrits: 0,
  userMiss: 0,
  userDodge: 0,
  mobHits: 0,
  mobDmgDelt: 0,
  mobDmgTaken: 0,
  mobCrits: 0,
  mobMiss: 0,
  mobDodge: 0,
};
stats.userMiss++;
console.log(stats);
  • 0
    Я имею в виду, я мог. stats. часть должна была быть очевидна для меня. Мне сказали, что использование Object.assign - хороший способ справиться со всем этим. Но, возможно, они имели в виду, когда вы имеете дело с объектами сеанса. В любом случае, спасибо!
1

ИМХО, это то, что вы пытаетесь сделать:

let stats = {
  rounds: 0, userHits: 0, userDmgDelt: 0, userDmgTaken: 0, userCrits: 0, userMiss: 0, userDodge: 0, mobHits: 0, mobDmgDelt: 0, mobDmgTaken: 0, mobCrits: 0, mobMiss: 0, mobDodge: 0,
};

stats = Object.assign(stats, {
    userMiss: ++stats.userMiss
});

console.log(stats)

Но это лучший immutable подход:

let stats = {
      rounds: 0, userHits: 0, userDmgDelt: 0, userDmgTaken: 0, userCrits: 0, userMiss: 0, userDodge: 0, mobHits: 0, mobDmgDelt: 0, mobDmgTaken: 0, mobCrits: 0, mobMiss: 0, mobDodge: 0,
    };

let newStats = Object.assign({}, stats, {
    userMiss: ++stats.userMiss
});

console.log(newStats)

Кроме того, вы можете использовать новейший деструктурирующий object destructuring ES6 следующим образом:

let stats = {
  rounds: 0, userHits: 0, userDmgDelt: 0, userDmgTaken: 0, userCrits: 0, userMiss: 0, userDodge: 0, mobHits: 0, mobDmgDelt: 0, mobDmgTaken: 0, mobCrits: 0, mobMiss: 0, mobDodge: 0,
};

    let newStats = { ...stats, userMiss: ++stats.userMiss };

    console.log(newStats)
1

userMiss - это ключ, определенный в stats объекта. Итак, чтобы получить доступ к этому свойству, вам нужно написать stats.userMiss.

stats = Object.assign(stats, {
userMiss: stats.userMiss++,

});

1

Вы должны использовать ++stats.userMiss для обновления значения userMiss

let stats = {
      rounds: 0,
      userHits: 0,
      userDmgDelt: 0,
      userDmgTaken: 0,
      userCrits: 0,
      userMiss: 0,
      userDodge: 0,
      mobHits: 0,
      mobDmgDelt: 0,
      mobDmgTaken: 0,
      mobCrits: 0,
      mobMiss: 0,
      mobDodge: 0,
    };

stats = Object.assign(stats, {
    userMiss: ++stats.userMiss
});

console.log(stats)
  • 0
    Это должно быть ++stats.userMiss; без Object.assign (то, чего ОП хотел избежать).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню