#javascript #arrays #json #reactjs
#javascript #массивы #json #reactjs
Вопрос:
Я выполняю вызов api, который возвращает массив объектов json. Вот пример того, что я могу ожидать от возврата:
[
{"id": 1, "name": "Pete", "age": 22},
{"id": 2, "name": "Sarah", "age": 32},
{"id": 3, "name": "Marshall", "age": 33}
]
Я пытаюсь выполнить цикл по этому объекту, чтобы создать строки таблицы, при этом динамически назначая каждый ключ в каждом объекте json в качестве атрибута, без необходимости явно указывать ключ. Например, я хотел бы отобразить этот объект в следующей структуре:
<tr key=1>
<td>Pete</td>
<td>22</td>
</tr>
<tr key=2>
<td>Sarah</td>
<td>32</td>
</tr>
<tr key=3>
<td>Marshall</td>
<td>33</td>
</tr>
Мой устаревший код выглядит следующим образом:
var MyMembers= this.props.Members.map((Member) => {
return (
<tr key={Member.id}>
<td>{Member.name}</td>
<td>{Member.age}</td>
</tr>
)
});
Однако в этом фрагменте устаревшего кода я явно вызываю атрибуты ‘name’ и ‘age’ для создания тегов ‘td’. Есть ли способ, которым я мог бы перебирать каждый объект и создавать значение ‘td’ для каждого ключа в указанном объекте без явного вызова имени ключа?
Ответ №1:
Это должно сработать:
var MyMembers= this.props.Members.map((Member) => {
var keys = Object.keys(Member)
var index = keys.indexOf("id");
if (index > -1) {
// removes the "id" element from the keys.
keys.splice(index, 1);
}
var divs = keys.map(k => <td>{Member[k]}</td>)
return (
<tr key={Member.id}>
divs
</tr>
)
});
Комментарии:
1. Спасибо за это @ryan. Я думаю, что ваша логика, похоже, делает именно то, что я хочу. Когда я только что попробовал это, он выдает ошибку, в которой говорится, что «Член» не является функцией. Я предполагаю, что это результат этого раздела: ‘Member (k)’. Я все еще новичок в react / js, поэтому я не уверен, что это проблема.
2. это должно быть Member[k] вместо Member(k) . Отредактировано.
Ответ №2:
Если вы хотите сделать это функциональным способом, вы можете использовать это:
var list = this.state.data.map(p => {
return (
<tr key={p.id}>
{Object.keys(p).filter(k => k !== 'id').map(k => {
return (<td key={p.id '' k}>{p[k]}</td>);
})}
</tr>
);
})
Или для понимания прочитанного разделите элементы из окончательного возврата:
var list = this.state.data.map(p => {
var items = Object.keys(p)
.filter(k => k !== 'id')
.map(k => {
return (
<td key={p.id k}>{p[k]}</td>
)
});
return (
<tr key={p.id}>
{items}
</tr>
);
});