javascript - How do you create a table from a list of objects using React? - Stack Overflow

I create the table header (1 row) in a similar way which only required one loop. Here, I have two loops

I create the table header (1 row) in a similar way which only required one loop. Here, I have two loops that're nested.

import { Component } from 'react';
import ReactDOM from 'react-dom';

class InventoryView extends Component {
  getTableBodyAsReactElement() {
    let inv = [{'upc': 123}, {'upc': 454}];
    console.log('inv: ', inv);

    return (!inv) ? null : (
      <tbody>
        {inv.forEach((item) => {
          console.log('item: ', item);
          return(
            <tr>
              {Object.entries(item).forEach((field) => {
                console.log('field: ', field);
                return <td>{field[1]}</td>
              })}
            </tr>
          );
        })}
      </tbody>
    );
  }

  render() {
    return(
      <table>
        {this.getTableBodyAsReactElement()}
      </table>
    )
  }
}

ReactDOM.render(
  <InventoryView />,
  mountNode
);

It looks like all the expected data is there when I print it. The expected behavior is for 123 and 454 to be displayed in the browser in the same column.

I create the table header (1 row) in a similar way which only required one loop. Here, I have two loops that're nested.

import { Component } from 'react';
import ReactDOM from 'react-dom';

class InventoryView extends Component {
  getTableBodyAsReactElement() {
    let inv = [{'upc': 123}, {'upc': 454}];
    console.log('inv: ', inv);

    return (!inv) ? null : (
      <tbody>
        {inv.forEach((item) => {
          console.log('item: ', item);
          return(
            <tr>
              {Object.entries(item).forEach((field) => {
                console.log('field: ', field);
                return <td>{field[1]}</td>
              })}
            </tr>
          );
        })}
      </tbody>
    );
  }

  render() {
    return(
      <table>
        {this.getTableBodyAsReactElement()}
      </table>
    )
  }
}

ReactDOM.render(
  <InventoryView />,
  mountNode
);

It looks like all the expected data is there when I print it. The expected behavior is for 123 and 454 to be displayed in the browser in the same column.

Share Improve this question asked Mar 26, 2018 at 0:03 James T.James T. 9881 gold badge13 silver badges29 bronze badges
Add a ment  | 

2 Answers 2

Reset to default 1

.forEach() does not return any value (it returns undefined). Those returns have no effect.

If you want to get an object and return a list of <td>s based on its properties, use .map().

In other words, convert the object into the <td>s using .map() instead of .forEach():

class InventoryView extends Component {
  getTableBodyAsReactElement() {
    let inv = [{ 'upc': 123 }, { 'upc': 454 }];
    console.log('inv: ', inv);

    return (!inv) ? null : (
      <tbody>
        {inv.map((item) => {                                // changed here
          console.log('item: ', item);
          return (
            <tr>
              {Object.entries(item).map((field) => {        // changed here
                console.log('field: ', field);
                return <td>{field[1]}</td>
              })}
            </tr>
          );
        })}
      </tbody>
    );
  }

  render() {
    return (
      <table border="1">
        {this.getTableBodyAsReactElement()}
      </table>
    )
  }
}

map (as opposed to forEach) will return the items as an array, which can then be rendered.

Likewise, Object.entries() returns a key/val pair of the object as an array. However, it seems all you need is Object.values(), so unless necessary you could simplify your code:

class InventoryView extends React.Component {
  getTableBodyAsReactElement() {
    let inv = [{'upc': 123}, {'upc': 454}];
    
    return (!inv) ? null : ( 
      <tbody> 
      {
        inv.map(item => {          
          return (
            <tr> 
            {
              Object.values(item).map(value => {
                return (<td>{value}</td>)
              })
            } 
            </tr>
          );
        })
      }
      </tbody>
    );
  }
  render() {
    return (<table>{this.getTableBodyAsReactElement()}</table>)
  }
}
ReactDOM.render(<InventoryView />, document.body );
table{ border:1px solid; }
<script src="https://cdnjs.cloudflare./ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare./ajax/libs/react/15.1.0/react-dom.min.js"></script>

发布者:admin,转转请注明出处:http://www.yc00.com/questions/1745272932a4619859.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信