如何按升序和降序对列进行排序?

Posted

技术标签:

【中文标题】如何按升序和降序对列进行排序?【英文标题】:how sort columns in ascending and descending order? 【发布时间】:2020-11-09 02:46:18 【问题描述】:

我使用对象数组创建了表,现在我不明白我们如何通过单击 reactjs 中的列名按升序和降序对表进行排序。我在***上尝试了很多概念,但它似乎对这个没有用。这是一个非常愚蠢的问题,但我已经停止了很多天。

 class Hello extends Component 
    constructor(props) 
        super(props)
    
        this.state = 
          search: '',
            Data:[
                
                    id: 1,
                    fullName: 'abc',
                    email:'example@gmail.com',
                    
                ,
                
                    id: 2,
                    fullName: 'qps',
                    email:'qps@gmail.com',
                    
                ,
                
                    id: 3,
                    fullName: 'qwe',
                    email:'qwe@gmail.com',
                    
                ,
             ]
        
    
         function Sort()
//what need to write here;

        render() 
            return (
                
                <div>
                    <h1>welcome to React</h1>
                    <table className="table table-hover table-dark">
                    
                    <tbody>
                        <tr>
                            <th onChange=this.Sort.bind(this)>ID</th>
                            <th>Full Name</th>
                            <th>Email</th>
                        </tr>
                    
                       this.state.Data.map((item,index)=>(
                        <tr key=item.id>
                            
                            <td >item.id</td>
                        
                            <td >item.fullName</td>
                            <td>item.email</td>
                        </tr>
                    ))
                    
                    </tbody>
                    </table>
    
                </div>
            )
        
    
    export default Hello

【问题讨论】:

您想按什么排序,电子邮件、id 还是全名? 【参考方案1】: 您需要将onChange 处理程序切换为onClick。 添加一些状态来存储最后的排序方向; 使用数组sort() 方法,但注意不要改变您的状态。
  this.state = 
    order: 'ASC'
  ...

function sort() 
  let sortedList = [...this.state.Data];
  let newOrder = this.state.order === 'ASC' ? 'DESC' : 'ASC';
  if (newOrder === 'ASC') 
    sortedList.sort((a, b) => a.id - b.id)
   else 
    sortedList.sort((a, b) => b.id - a.id)
  
  
  this.setState( Data: sortedList, order: newOrder );

为了能够对任何列进行排序,我将进行以下更改:

  function sort(column) 
    const sortedList = [...this.state.Data];
    const newOrder = this.state.order === "ASC" ? "DESC" : "ASC";
    const sortValue = (v1, v2) => 
      if (column === 'id') return v1.id - v2.id;
      return (v1[column] ?? '')
        .toLowerCase()
        .localeCompare((v2[column] ?? '').toLowerCase())
    
    if (newOrder === "ASC") 
      sortedList.sort((a, b) => sortValue(a, b));
     else 
      sortedList.sort((a, b) => sortValue(b, a));
    
    this.setState( Data: sortedList, order: newOrder );
  

并为每个列标题添加适当的onClick 处理程序。

<th onClick=() => this.sort('id')>ID</th>
<th onClick=() => this.sort('fullName')>Full Name</th>
<th onClick=() => this.sort('email')>Email</th>

【讨论】:

当我点击console.log() 中显示的点击列但表格无法排序时 抱歉,我在 setState 中有错字,DATA 应该是 Data。我会更新的 如果我想按名称对其进行排序,那么我需要在其中进行哪些更改? 我更新了答案和 CodeSandbox 以允许对所有列进行排序。【参考方案2】:

为升序或降序添加一个状态变量,然后在你的排序函数中:

function Sort(a,b)
    if(this.state.ascending)
        return a.id - b.id
    
    return b.id - a.id

然后在你的渲染函数中在地图前添加排序方法:

const Data = [...this.state.Data]
//...

      Data.sort((a,b)=>this.Sort(a,b)).map((item,index)=>(
        <tr key=item.id>           
          <td >item.id</td>        
          <td >item.fullName</td>
          <td>item.email</td>
        </tr>
              
               

最后改变你的 onClick 只改变升/降的状态:

 <th onClick=()=>this.setState(ascending: !this.state.ascending)>ID</th>

【讨论】:

这种方法对每个渲染进行排序,而不是仅在单击时进行排序,所以它可能不是最好的方法

以上是关于如何按升序和降序对列进行排序?的主要内容,如果未能解决你的问题,请参考以下文章

在升序和降序之间切换对列进行排序

如何在 Reactjs 中按升序或降序对数据进行排序?

如何按日期降序对 NSDate 进行排序,但在该日期内时间升序?

具有数千、数百万和数十亿的问题排序数字(货币)

如何在 C++ 中按向量进行升序和降序排序

按升序或降序对数字或字母进行通用排序