解决vue elementUI table中字符串和数字混合排序

解决vue elementUI table中字符串和数字混合排序

在最近的项目中,有个表格的排序因为存在字符串导致排序出现错误,网上找了半天只找到了一个CSDN推荐的,但是那个方法对于当前项目并不可用,不过大家也可以去借鉴一下

https://blog.csdn.net/qq_39186346/article/details/103861876

项目需求:

在这里插入图片描述
在每月数据中,因为没有该月份数据,前端需要使用“-”替换,但是在使用了sortable排序功能后,因为是数字和字符串混合,会导致排序存在错误

于是,我们直接在表格头部使用 @sort-change=“sortChange”
![](https://img-blog.csdnimg.cn/20201209160031971.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzIwODA1NzY5,size_16,color_FFFFFF,t_70
然后在methods中定义该方法:

// 自定义排序
    sortChange (column) {
      /**
       * 思路:
       * 首先将空值或者说不符合要去的行数据过滤掉,形成新的数组
       * 对新的数组进行常规升/降序排序,根据传入的column.order判断是升序还是降序 let sortingType = column.order
       * 如果点击表头取消排序也需要做判断,将数据还原成接口返回的数据
       *
       */
      let _this = this
      let tempTableList = []
      let tempTableData = []
      // 获取字段名称和排序类型
      let fieldName = column.prop
      let sortingType = column.order
      // 过滤出不符合排序的数据形成新数组,最后将新数组的数据放入到排序后的数组中,保证数据的完整性
      tempTableList = Object.assign([], _this.tableData.filter(el => (el[fieldName] === '-' || el[fieldName] === undefined)))
      // 过滤出符合排序的数据形成新数组,再对该数组进行常规排序
      tempTableData = Object.assign([], _this.tableData.filter(el => (el[fieldName] !== '-' && el[fieldName] !== undefined)))
      // 按照降序排序
      if (sortingType !== null) {
        if (sortingType === 'descending') {
          // 冒泡排序新数组
          tempTableData = tempTableData.sort((a, b) => b[fieldName] - a[fieldName])
          // 将不符合排序的数组重新放入排序完成的数组末尾,保证数据完整
          tempTableData.reverse()
          tempTableList.forEach(el => {
            tempTableData.push(el)
          })
          tempTableData.reverse()
        } else { // 按照升序排序
          // 冒泡排序新数组
          tempTableData = tempTableData.sort((a, b) => a[fieldName] - b[fieldName])
          // 将不符合排序的数组重新放入排序完成的数组末尾,保证数据完整
          tempTableList.forEach(el => {
            tempTableData.push(el)
          })
        }
        _this.tableData = Object.assign([], tempTableData)
      } else {
        // 如果是取消排序,则将数据还原成接口返回的数据
        _this.tableData = Object.assign([], _this.allTableData)
      }
    }

总体思路还是简单的将不符合排序要求的数据线过滤出去,在将数据排序,排序完成后再将原先过去过去的数据push回表格数组中。
这里因为项目需求相对简单,但是同样的,如果是存在中英文、大小写和数字混合的情况,也可以使用@sort-change方法,通过正则判断是中英文、大小写还是数字,如果是中英文、大小写,则转换成对应的ASCII值再进行比较
如果是时间的排序,需要将日期转换成时间戳再进行比较,但是需要记住排序完成后需要将数据中的时间戳再转换成对应的时间,否则前端显示会有错误

仅供参考,有问题欢迎指出

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Vue ElementUI提供了非常方便的表格组件,并且内置了排序功能。只需要在表格的`<el-table-column>`元素上指定`prop`属性和`sortable`属性即可实现排序。 以下是一个基本的示例代码: ``` <template> <el-table :data="tableData" style="width: 100%"> <el-table-column prop="date" label="日期" sortable></el-table-column> <el-table-column prop="name" label="姓名" sortable></el-table-column> <el-table-column prop="address" label="地址"></el-table-column> </el-table> </template> <script> export default { data() { return { tableData: [ { date: '2021-01-01', name: '张三', address: '北京市' }, { date: '2021-01-02', name: '李四', address: '上海市' }, { date: '2021-01-03', name: '王五', address: '广州市' }, ], }; }, }; </script> ``` 在上面的代码,我们在`<el-table-column>`元素上指定了`prop`和`sortable`属性,其`prop`属性对应表格数据的字段名,`sortable`属性指定该列可以排序。 如果我们希望默认按某个字段升序排序怎么办呢?我们可以在`<el-table>`元素上指定`default-sort`属性,如下所示: ``` <template> <el-table :data="tableData" style="width: 100%" :default-sort="{ prop: 'date', order: 'ascending' }"> <el-table-column prop="date" label="日期" sortable></el-table-column> <el-table-column prop="name" label="姓名" sortable></el-table-column> <el-table-column prop="address" label="地址"></el-table-column> </el-table> </template> <script> export default { data() { return { tableData: [ { date: '2021-01-01', name: '张三', address: '北京市' }, { date: '2021-01-02', name: '李四', address: '上海市' }, { date: '2021-01-03', name: '王五', address: '广州市' }, ], }; }, }; </script> ``` 在上面的代码,我们在`<el-table>`元素上指定了`default-sort`属性,它是一个对象,包含两个属性:`prop`表示默认排序的字段名,`order`表示默认排序的方式,取值为`ascending`(升序)或`descending`(降序)。这样,表格就会默认按日期升序排序
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值