#javascript #reactjs
Вопрос:
У меня есть довольно четкая функция объекта и карты в react js.
Мои данные находятся в переменной состояния this.state.response
response = [
{
"number": "CA1",
"name": "Kiran",
"type": "Books",
"contact": "98989898"
},
{
"number": "CA2",
"name": "Rahul",
"type": "MP3",
"contact": "98989898"
}
]
amp; Здесь я хочу распечатать данные в таблице в файле react jsx
{
this.state.response !== "" amp;amp;
this.state.response.map((data, i) => (
<tr key={i}>
<td>{i 1}</td>
{
console.log("Here I want to print data");
}
<td></td>
</tr>
))
}
Я могу получить доступ к каждым данным с помощью {data.number} или {data.name}
Но я не знаю таких ключей, как номер, имя или тип в ответе, который представляет собой динамические данные из API.
Поэтому мой вопрос заключается в том, как я могу создать несколько со значением данных из ответа.
Ответ №1:
Используйте метод Object.keys() для получения массива ключей в данном объекте
{
this.state.response !== "" amp;amp;
this.state.response.map((data, i) => (
<tr key={i}>
<td>{i 1}</td>
{
Object.keys(data) //Returns array of all keys: Array ["number", "name", "type", "contact"]
}
<td></td>
</tr>
))
}
Комментарии:
1. Я пытаюсь выполнить свои требования, дам вам знать. Спасибо
Ответ №2:
Object.values
будет loop
через количество значений в data
и показывать их в td
теге
this.state.response.map((data, i) => (
<tr key={i}>
<td>{i 1}</td>
{Object.values(data).map(val => {
return <td>{val}</td>;
})
}
</tr>
));
Чтобы получить keys
вместе с values
тем, что вам придется использовать Object.entries
.
this.state.response.map((data, i) => (
<tr key={i}>
<td>{i 1}</td>
{Object.entries(data).map(val => {
return <div>
<td>{val[0]}</td><td>{val[1]}</td>
<br />
</div>
})
}
</tr>
))
Ответ №3:
Object.entries
вернет все свойства и значения в виде ключей и значений в массиве, Object.keys
вернет все свойства в массиве и Object.values
вернет все значения в массиве
this.state.response.map((data, i) => (
<tr key={i}>
<td>{i 1}</td>
{
console.log(Object.entries(data));
Object.values(data).map(d => <td>{d}</td>);
}
<td></td>
</tr>
Комментарии:
1. Есть ли какой-либо код для прямого отображения значений полей в <td> ? Спасибо вам за ваш ответ кстати
2. Да, я обновил код, здесь будут отображаться только значения.
Ответ №4:
Вы можете получить ключи от объекта с помощью Object.keys(object)
. После этого вы можете просмотреть ключи и получить доступ к каждому ключу на каждом объекте.
class ResponseTable extends React.Component {
state = {
response: [{
"number": "CA1",
"name": "Kiran",
"type": "Books",
"contact": "98989898"
}, {
"number": "CA2",
"name": "Rahul",
"type": "MP3",
"contact": "98989898"
}]
};
render() {
const keys = Object.keys(this.state.response[0]);
return (
<table>
<thead>
<tr>{keys.map(key => <th key={key}>{key}</th>)}</tr>
</thead>
<tbody>
{this.state.response.map((item, index) => (
<tr key={index}>
{keys.map(key => <td key={key}>{item[key]}</td>)}
</tr>
))}
</tbody>
</table>
);
}
}
ReactDOM.render(
<ResponseTable />,
document.querySelector("#response-table-container")
);
<script src="https://unpkg.com/react@17/umd/react.production.min.js"></script>
<script src="https://unpkg.com/react-dom@17/umd/react-dom.production.min.js"></script>
<div id="response-table-container"></div>
Обратите внимание, что это решение используется this.state.response[0]
для определения ключей. Если этот массив может быть пустым, вам, возможно, потребуется установить какое-то значение по умолчанию, потому this.state.response[0]
что будет оцениваться undefined
.
В этом сценарии одним из решений было бы использовать пустой объект по умолчанию:
Object.keys(this.state.response[0] || {})
Который вернет пустой массив, если ответ будет пустым. Но вы также можете отобразить сообщение, уведомляющее пользователя о пустых результатах.
if (this.state.response.length == 0) {
return <div>Nothing found</div>;
}
Это всего лишь примеры, и вам придется самим определить, что вы хотите делать в таком сценарии. Если этот сценарий никогда не произойдет, вам не придется с ним справляться.