像我一样进行排序时,如何显示产品中的所有数据?

时间:2019-11-29 04:31:38

标签: javascript reactjs sorting

我希望能够在对价格进行排序时显示产品中的所有属性。


输入数据:

const products = [
  {
    "index": 0,
    "isSale": true,
    "isExclusive": false,
    "price": "Rs.2000",
    "productImage": "product-1.jpg",
    "productName": "Striped shirt",
    "size": [
      "XS",
      "S",
      "L",
      "XL"
    ]
  },
  {
    "index": 1,
    "isSale": false,
    "isExclusive": false,
    "price": "Rs.1250",
    "productImage": "product-2.jpg",
    "productName": "Denim shirt",
    "size": [
      "XS",
      "S"
    ]
  },
  {
    "index": 2,
    "isSale": false,
    "isExclusive": true,
    "price": "Rs.1299",
    "productImage": "product-3.jpg",
    "productName": "Plain cotton t-shirt",
    "size": [
      "S",
      "M"
    ]
  },
  {
    "index": 3,
    "isSale": false,
    "isExclusive": false,
    "price": "Rs.1299",
    "productImage": "product-4.jpg",
    "productName": "Plain 3/4 sleeve cotton t-shirt",
    "size": [
      "XL"
    ]
  },
  {
    "index": 4,
    "isSale": false,
    "isExclusive": false,
    "price": "Rs.2500",
    "productImage": "product-5.jpg",
    "productName": "White dress shirt",
    "size": [
      "M",
      "L"
    ]
  },
  {
    "index": 5,
    "isSale": false,
    "isExclusive": false,
    "price": "Rs.2399",
    "productImage": "product-6.jpg",
    "productName": "Long Sleeve Skivvy Top",
    "size": [
      "XS",
      "S",
      "M"
    ]
  },
  {
    "index": 6,
    "isSale": true,
    "isExclusive": false,
    "price": "Rs.2000",
    "productImage": "product-7.jpg",
    "productName": "Puffer Vest with Hood",
    "size": [
      "M",
      "L",
      "XL"
    ]
  },
  {
    "index": 7,
    "isSale": false,
    "isExclusive": true,
    "price": "Rs.1699",
    "productImage": "product-8.jpg",
    "productName": "Funnel Neck Swing Top",
    "size": [
      "XS",
      "S",
      "XL"
    ]
  }
];

 import React, { Component } from 'react';
    import { render } from 'react-dom';
    import products from './products';

    class App extends Component {

      state = {
        products,
        prices: [],
      }

      componentDidMount() {
        const { products, prices} = this.state;

        prices = products.map(p => p.price.substr(3));
        this.setState({ prices })
      }

      sortAscending = () => {
        const { prices } = this.state;
        prices.sort((a, b) => a - b)    
        this.setState({ prices })
      }

      sortDescending = () => {
        const { prices } = this.state;
        prices.sort((a, b) => a - b).reverse()
        this.setState({ prices })
      }

      render() {
        const { prices } = this.state;
        return (
          <div>
            <ul>
              {
                prices.map((p, i) => {
                  return <li>{i} - Rs.{p}</li>;
                })
              }
            </ul>
            <button onClick={this.sortAscending}>asc</button>
            <button onClick={this.sortDescending}>desc</button>
          </div>
        );
      }
    }

    render(<App />, document.getElementById('root'));

1 个答案:

答案 0 :(得分:1)

您可以对products数组(而不只是价格)进行排序,然后仅添加需要在表中显示的属性。

class App extends Component {
  state = {
    products,
  }

  sort = (direction) => () => {
    const { products } = this.state;
    const sorted = products.sort((a, b) => {
      const priceA = a.price.substr(3);
      const priceB = b.price.substr(3);

      if (direction === 'asc') {
        return priceA - priceB;
      }

      return priceB - priceA;
    });

    this.setState({ products: sorted });
  }

  render() {
    const { products } = this.state;

    return (
      <div>
        <table>
          <thead>
            <tr>
              <th>Product</th>
              <th>Price</th>
            </tr>
          </thead>
          <tbody>
            {
              products.map(({
                productName,
                price,
              }, i) => (
                <tr key={i}>
                  <td>{productName}</td>
                  <td>{price}</td>
                </tr>
              ))
            }
          </tbody>
        </table>
        <button onClick={this.sort('asc')}>asc</button>
        <button onClick={this.sort('desc')}>desc</button>
      </div>
    );
  }
}

StackBlitz演示:https://stackblitz.com/edit/react-wtgnpd