Использование имени переменной в цикле .forEach - PullRequest
0 голосов
/ 26 сентября 2019

Я работаю с JS / React, в настоящее время у меня есть массивы, вложенные в массив.Структура выглядит следующим образом:

const ezra = ["Patriots", "Bears", "Vikings", "Titans", "Jets", "Bengals"]
const adam = ["Chiefs", "Cowboys", "Packers", "Ravens", "Broncos", "Cardinals"]

const playerList = [ezra, adam]

У меня также есть состояния React, определенные следующим образом:

this.state{
   ezraWins: 0
   adamWins: 0
}

Я извлекаю данные из React и использую playerList.forEach для подсчета общих выигрышей.команд под каждого игрока.Я хотел бы найти сумму и .setState, чтобы изменить значение выигрышей $ {player} на общее количество.То есть, когда я насчитал победы команд ezra, я хочу:

this.setState({ezraWins: counter})

Вот глупый пример того, как я думал, что это может работать:

 playerList.forEach((player) => {
      const playerWins = `${player}Wins`
      const playerVariable = `${player}`
      //  use loop to tally total wins, add that to counter variable

      this.setState({${playerWins} : counter}) 

, но когда яconsole.log те переменные, которые я получаю:

playerList = Патриоты, Медведи, Викинги, Титаны, Джетс, БенгалсВинс

playerVariable = Патриоты, Медведи, Викинги, Титаны, Джетс, Бенгал *

Можно ли как-нибудь получить имя каждого массива в playerList и использовать его для команды .setState в моем коде?Я также попытался немного поэкспериментировать с окном, но получил ошибку, которую не записал, вероятно, потому, что я не сделал playerList и каждый массив в нем глобальным.Это способ сделать это или есть лучший метод?Насколько я понимаю, глобальные переменные - это нет-нет.

Ответы [ 2 ]

0 голосов
/ 27 сентября 2019

Потребовалось много переоснащения, но я нашел лучший способ достичь того же результата, поместив все свои данные в состояние.Мои конечные состояния выглядели так:

          ezra: {name: "ezra", wins: 0, 
            teams: ["Patriots", "Bears", "Vikings", "Titans", "Jets", "Bengals"]},
          adam: {name: "adam", wins: 0, 
            teams: ["Chiefs", "Cowboys", "Packers", "Ravens", "Broncos", "Cardinals"]}

По предложению Майка 'Pomax' Kamermans я сделал полную копию своего this.state в начале своей функции:

let updateState = Object.assign({}, this.state)

и скопировал мои суммы выигрышей в переменную updateState следующим образом:

updateState[player.name].wins = counter

, где player - это копия объекта состояния каждого игрока, то есть this.state.adam.Возможно, существует лучший способ ссылки на конкретный объект состояния, чем в моем соглашении, где я дал ему имя prop, совпадающее с именем переменной состояния.Однако это было лучшее, что я знаю сейчас.

Наконец, после того, как я просмотрел все суммы выигрышей и обновил их до updateState, я обновил весь this.state с помощью следующей команды:

this.setState(updateState)

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

0 голосов
/ 26 сентября 2019

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

Попробуйте сохранить имена игроков следующим образом:

const ezra = {name: "ezra", teams: ["Patriots", "Bears", "Vikings", "Titans", "Jets", "Bengals"]}

и назначить playerWins и playerVariable какэто:

const playerWins = `${player.name}Wins`
const playerVariable = `${player.name}`

Надеюсь, это поможет.

...