Как перечислить отдельные ключевые значения в объекте в React

#javascript #reactjs #jsx

#javascript #reactjs #jsx

Вопрос:

В настоящее время я создаю таблицу с помощью React, где метки являются определенными ключами объекта, а записи таблицы — значениями объекта. Набор данных, который я использую, представляет собой массив объектов, которые я использую map для получения каждого отдельного объекта. Вот как я это делаю.

 {
  data.map(graph =>
    <div key={graph.ID} className="tables">
      <table>
      <tr>
        <th>{Object.keys(graph)[0]}</th>
        <th>{Object.keys(graph)[1]}</th>
        <th>{Object.keys(graph)[2]}</th>
        <th>{Object.keys(graph)[3]}</th>
        <th>{Object.keys(graph)[4]}</th>
        <th>{Object.keys(graph)[5]}</th>
        <th>{Object.keys(graph)[6]}</th>
        <th>{Object.keys(graph)[7]}</th>
        <th>{Object.keys(graph)[8]}</th>
        <th>{Object.keys(graph)[9]}</th>
        <th>{Object.keys(graph)[10]}</th>
        <th>{Object.keys(graph)[11]}</th>
        <th>{Object.keys(graph)[12]}</th>
        <th>{Object.keys(graph)[13]}</th>
      </tr>
      <tr>
        <td>{Object.values(graph)[0]}</td>
        <td>{Object.values(graph)[1]}</td>
        <td>{Object.values(graph)[2]}</td>
        <td>{Object.values(graph)[3]}</td>
        <td>{Object.values(graph)[4]}</td>
        <td>{Object.values(graph)[5]}</td>
        <td>{Object.values(graph)[6]}</td>
        <td>{Object.values(graph)[7]}</td>
        <td>{Object.values(graph)[8]}</td>
        <td>{Object.values(graph)[9]}</td>
        <td>{Object.values(graph)[10]}</td>
        <td>{Object.values(graph)[11]}</td>
        <td>{Object.values(graph)[12]}</td>
        <td>{Object.values(graph)[13]}</td>
      </tr>
      </table>
    </div>
  )
}
 

Как вы можете видеть, каждая запись в таблице представляет собой отдельный ключ / значение и graph представляет каждый отдельный объект в массиве. Проблема в том, что некоторые объекты имеют более 14 ключей, поэтому я хочу перечислить каждый ключ и значение в каждом объекте в JSX независимо от размера. Кто-нибудь знает, как это сделать? Я пытался использовать циклы for (обычно так я перечисляю отдельные ключи), но, похоже, я не могу этого сделать в JSX.

Ответ №1:

Используйте Array.map() для каждой строки. Для th итерации ключей и для td использования Object.entries() для получения как ключей (для ключей элемента), так и значений:

 {
  data.map(graph => (
    <div key={graph.ID} className="tables">
      <table>
        <tr>
        {
          Object.keys(graph)
            .map(key => <th key={key}>{key}</th>)
        }
        </tr>
        <tr>
        {
          Object.entries(graph)
            .map(([key, val]) => <th key={key}>{val}</th>)
        }
        </tr>
      </table>
    </div>
  ))
}
 

Ответ №2:

Я думаю, вы могли бы сделать что-то вроде этого:

 {
  data.map(graph => {
    return (
      <div key={graph.ID} className="tables">
        <table>
          <tr>
            {Object.keys(graph).map(key => {
              return <th>{key}</th>
            })}
          </tr>
          <tr>
            {Object.keys(graph).map(key => {
              return <th>{graph[key]}</th>
            })}
          </tr>
        </table>
      </div>
    )
  })
}
 

Ответ №3:

Вы можете просто использовать map() метод для этого:

 <tr>
  Object.keys(graph).map((key) => (<th>key</th>))
</tr>
<tr>
  Object.values(graph).map((value) => (<td>value</td>))
</tr>
 

Примечание: это, скорее всего, будет жаловаться на отсутствие key реквизитов, поэтому вам придется добавлять ключевое значение к каждому элементу. (использование значения ключа graph объекта является одним из вариантов)