简体   繁体   English

在React中动态迭代json对象数组

[英]Dynamically iterating over an array of json objects in React

I am executing an api call that returns an array of json objects. 我正在执行一个api调用,该调用返回一个json对象数组。 Here is an example of what I can expect to be returned: 这是我可以预期返回的示例:

[
  {"id": 1, "name": "Pete", "age": 22},
  {"id": 2, "name": "Sarah", "age": 32},
  {"id": 3, "name": "Marshall", "age": 33}
]

I am trying to loop through this object in order to create table rows, whilst dynamically assigning each key in each json object as an attribute, without having to explicitly state the key. 我试图遍历此对象以创建表行,同时动态地将每个json对象中的每个键分配为属性,而不必显式声明键。 For example, I would like to render this object into the following structure: 例如,我想将此对象渲染为以下结构:

<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>

My legacy code looks like this: 我的旧代码如下所示:

var MyMembers= this.props.Members.map((Member) => {
  return (
    <tr key={Member.id}>
      <td>{Member.name}</td>
      <td>{Member.age}</td>
    </tr>
  )
});

In this piece of legacy code I am however explicitly calling the 'name' and 'age' attributes in order to create 'td' tags. 但是,在这段旧代码中,我明确地调用了“名称”和“年龄”属性,以便创建“ td”标签。 Is there a way that I could loop through each object and create a 'td' value for each key in said object without explicitly calling the key name? 有没有一种方法可以遍历每个对象并为该对象中的每个键创建一个“ td”值,而无需显式调用键名?

This should work: 这应该工作:

 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>
  )
 });

If you want to do it in a functional way you could use this: 如果您想以实用的方式进行操作,可以使用以下方法:

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>
  );
})

Or for reading comprehension split the items out of the final return: 或为了阅读理解,将项目从最终收益中分离出来:

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>
    );
});

JSFiddle JSFiddle

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM