element中table全部数据进行筛选和排序

这篇博客详细介绍了在前端使用Element-UI组件库进行数据表格的排序和筛选功能的实现。通过监听`filter-change`和`sort-change`事件,结合自定义过滤和排序方法,实现了动态筛选和排序表格数据。同时,展示了如何处理全局筛选和排序,以及如何在筛选和排序后更新分页数据。

筛选

1、@filter-change 要写在table根元素,也就是<el-table @filter-change="filterChange"></el-table>
2、需要筛选的项,要写上 :column-key=" 'aaa' "
3、要搜索全局,就要去掉对应筛选项的 :filter-method="xx"

排序

1、首先有两个数组tDatatableData
2、tableData用来放当前页的数据,tData用来放所有数据。
3、为表格绑定@sort-change事件,当点击表头的排序icon时,调用sort_change方法,该方法内部调用的sortFun方法可以为tableData进行排序,showedData显示排好序的前四条数据。

<template>
  <div>
    <el-table :data="tableData | dataslice(page, pageSize)" @filter-change="filterChange" @sort-change="sortChange">
      <el-table-column
        v-for="(item, index) in columns"
        :key="index"
        align="center"
        :fixed="item.fixed"
        :prop="item.prop"
        :label="item.label"
        :column-key="item.key"
        :min-width="item.width"
        :sortable="item.sortable"
        :show-overflow-tooltip="item.toolTip"
        :filters="item.filters ? Tfilters(item.prop) : null"
      />
      <!-- filters:不需要筛选的项要设置为null,不然会报错 -->
    </el-table>
    <el-pagination
      :current-page="page"
      :page-sizes.sync="pagesizes"
      :page-size.sync="pagesize"
      layout="total, sizes, prev, pager, next, jumper"
      :total="total"
    />
  </div>
</template>

<script>
export default {
  filters: {
    dataslice(array, page, limit) {
      const offset = (page - 1) * limit
      const newdata = offset + limit >= array.length ? array.slice(offset, array.length) : array.slice(offset, offset + limit)
      return newdata
    }
  },
  data() {
    return {
      page: 1,
      pageSize: 10,
      total: 0,
      tableData: [],
      tData: [], // 请求到数据后tabledata和tData都要进行赋值
      columns: [
        {
          prop: 'a',
          label: '测试1',
          width: '120',
          fixed: true // 是否固定列
        },
        {
          prop: 'b',
          label: '测试2',
          width: '120',
          filters: true, // 是否筛选
          key: 'b', // 全部数据进行筛选要设置column-key
          sortable: 'custom' // 全部数据排序要设置成custom
        },
        {
          prop: 'c',
          label: '测试3',
          width: '120',
          filters: true,
          key: 'c',
          sortable: 'custom'
        },
        {
          prop: 'd',
          label: '测试4',
          width: '120',
          filters: true,
          key: 'd',
          sortable: 'custom'
        }
      ],
      filtList: []
    }
  },
  computed: {
    /* 筛选的下拉选择项进行获取 */
    Tfilters() {
      return (prop) => {
        let lis = []
        const flis = []
        this.tableData.forEach(item => {
          lis.push(item[prop])
        })
        lis = Array.from(new Set(lis))
        lis.forEach(item => {
          const obj = {}
          obj.text = item
          obj.value = item
          flis.push(obj)
        })
        return flis
      }
    }
  },
  methods: {

    /* 全部数据排序 */
    sort_change(column) { // column是个形参,具体查看element-ui文档
      this.page = 1 // return to the first page after sorting
      this.total = this.tableData.length
      this.tableData = this.tableData.sort(this.sortFun(column.prop, column.order === 'ascending'))
    },
    sortFun(attr, rev) {
      // 第一个参数传入info里的prop表示排的是哪一列,第二个参数是升还是降排序
      if (rev === undefined) {
        rev = 1
      } else {
        rev = (rev) ? 1 : -1
      }
      return function(a, b) {
        a = a[attr]
        b = b[attr]
        if (a < b) {
          return rev * -1
        }
        if (a > b) {
          return rev * 1
        }
        return 0
      }
    },

    /* 前端处理全部数据筛选 */
    fliterChange(filters) {
      const lis = Object.values(filters)[0]
      const key = Object.keys(filters)[0]

      /* 将筛选条件添加到数组中 */
      if (this.filtList.length === 0) {
        this.filtList.push(filters)
      } else {
        const index = this.filtList.findIndex((item) => key in item)
        if (index !== -1) {
          this.filtList.splice(index, 1, filters)
        } else {
          this.filtList.push(filters)
        }
      }

      /* 筛选按钮进行筛选 */
      if (lis.length > 0) {
        this.tableData = this.tableData.filter(data => {
          return lis.includes(data[key])
        })
        this.total = this.tableData.length
        return this.tableData
      }

      /* 点击了重置按钮 */
      this.tableData = this.tData // 先拿到所有的数据

      // 把当前重置的数据过滤掉
      this.filtList = this.filtList2.filter(item => Object.values(item)[0].length !== 0)
      // 如果数组中还有筛选条件,进一步进行筛选
      if (this.filtList.length > 0) {
        this.filtList.forEach(item => {
          const lis = Object.values(item)[0]
          const key = Object.keys(item)[0]
          this.tableData = this.tableData.filter(data => {
            return lis.includes(data[key])
          })
        })
        this.total = this.tableData.length
        return this.tableData
      }
      // 筛选数组中没有数据了,拿到全部数据
      this.tableData = this.tData
      this.total = this.tableData.length
      return this.tableData
    }
  }
}
</script>

<style>
</style>
<think>我们正在讨论ClickHouse中的arrayElement函数。该函数用于访问数组中的元素。根据引用[1]中提到的,ClickHouse使用递归下降解析器解析SQL,因此我们可以在SQL查询中直接使用数组函数。arrayElement函数的语法:arrayElement(arr,index)。注意:索引是从1开始的。示例:假设我们有一个数组[10,20,30],那么arrayElement(arr,1)返回10,arrayElement(arr,2)返回20,依此类推。我们还可以使用更简洁的语法:arr[index]。例如,arr[1]等同于arrayElement(arr,1)。下面给出几个示例:1.访问固定数组的元素:SELECTarrayElement([1,2,3],2)--返回2或者SELECT[1,2,3][2]--返回22.从表中查询数组列的元素:假设有一张表t,其中有一列arr是数组类型,我们可以这样查询每个数组的第二个元素:SELECTarr[2]FROMt3.如果索引超出数组范围,不会抛出错误,而是返回对应数组元素类型的默认值(例如数值类型为0,字符串类型为空字符串等)。例如:SELECT[1,2,3][0]--返回0(因为索引从1开始,0是无效索引)SELECT[1,2,3][4]--返回04.使用表达式作为索引:SELECTarrayElement([10,20,30],1+1)--相当于索引2,返回205.结合其他函数使用:例如,可以使用arrayMap函数对数组的每个元素进行处理,然后取某个位置的元素。注意:在ClickHouse中,数组的索引必须是整数。如果使用浮点数,它将被转换为整数(向下取整)。另外,引用[5]提到了类型转换,如果数组元素是Nullable类型,那么当访问的元素为NULL时,返回NULL;如果索引无效,则返回默认值(对于Nullable类型,默认值就是NULL?实际上,索引无效时返回的是该类型的默认值,但如果数组元素是Nullable,则无效索引返回的是非Nullable的默认值,而不是NULL。但注意:如果数组定义允许NULL,那么数组中某个元素可能是NULL,而索引有效时返回的就是NULL。索引无效时返回的是该数组元素类型的默认值,且不是NULL(除非数组元素类型是Nullable))。下面是一个示例表,并插入一些数据:```sqlCREATETABLEarray_test(idInt32,arrArray(Int32))ENGINE=Memory;INSERTINTOarray_testVALUES(1,[10,20,30]),(2,[100,200]),(3,[]);```查询每个数组的第二个元素:```sqlSELECTid,arr[2]FROMarray_test;```结果:```idarr[2]120220030--因为数组为空,索引2无效,返回Int32的默认值0```如果数组元素类型是Nullable,例如:```sqlCREATETABLEarray_test_nullable(idInt32,arrArray(Nullable(Int32)))ENGINE=Memory;INSERTINTOarray_test_nullableVALUES(1,[1,NULL,3]),(2,[]);```查询:```sqlSELECTid,arr[2]FROMarray_test_nullable;```结果:```idarr[2]1NULL--因为第二个元素是NULL2NULL--数组为空,索引2无效,但注意:因为数组元素类型是Nullable(Int32),所以返回的是NULL(实际上,这里返回的是NULL,而不是0,因为默认值在Nullable类型中就是NULL?)```但是,实际上,对于数组越界的情况,ClickHouse返回的是数组元素类型的默认值,而如果数组元素类型是Nullable,则其默认值就是NULL。所以上例中,空数组的索引2返回NULL。因此,我们可以总结:arrayElement函数在索引有效时返回数组中的元素(可能是NULL,如果数组元素允许NULL且该位置为NULL),在索引无效(超出数组长度)时,返回数组元素类型的默认值(对于Nullable类型,默认值就是NULL)。另外,引用[2]中提到了Enum类型的行为类似于数字,但arrayElement函数同样可以用于Enum数组,因为Enum在内部存储为数字。引用[3][4]没有直接相关,但我们可以知道在JOIN操作或TinyLog引擎中,我们同样可以使用数组函数。引用[4]中TinyLog引擎不支持并发写,但我们可以用它来测试数组函数,因为它是简单的引擎。最后,我们给出一个稍微复杂的示例:使用arrayElement函数处理嵌套数组。示例:访问嵌套数组中的元素```sqlSELECT[[1,2],[3,4]][1]--返回[1,2]SELECT[[1,2],[3,4]][1][2]--返回2```以上是关于arrayElement函数的基本用法示例。根据指令,我们还需要生成相关问题:§§相关问题§§1.在ClickHouse中,如何创建一个包含数组列的表?2.除了arrayElement,ClickHouse还提供哪些常用的数组函数?3.在ClickHouse中,数组的索引是从0开始还是从1开始?4.如何处理数组越界访问的情况?5.在ClickHouse中,如何将查询结果中的多个行合并为一个数组?</think>### ClickHouse中`arrayElement`函数用法详解 `arrayElement`函数用于访问数组中的指定元素,语法为: $$ \text{arrayElement(array, index)} $$ 或使用简写形式: $$ \text{array[index]} $$ #### 核心特性: 1. **索引从1开始**:第一个元素索引为1(非0) 2. **越界处理**:索引超出范围时返回默认值(数值返回0,字符串返回空串) 3. **支持嵌套数组**:可访问多维数组元素 4. **兼容类型转换**:如引用[5]所示,支持`Nullable`类型转换 --- ### 使用示例 #### 示例1:基础用法 ```sql SELECT arrayElement([10, 20, 30], 2) AS elem1, -- 返回20 ['a','b','c'][3] AS elem2; -- 返回'c' ``` 结果: ``` ┌─elem1─┬─elem2─┐ │ 20 │ c │ └───────┴───────┘ ``` #### 示例2:越界处理 ```sql SELECT [100, 200][0] AS underflow, -- 返回0(索引<1) [5, 10][5] AS overflow; -- 返回0(索引>长度) ``` 结果: ``` ┌─underflow─┬─overflow─┐ │ 0 │ 0 │ └───────────┴──────────┘ ``` #### 示例3:嵌套数组访问 ```sql SELECT [[1,2], [3,4]][1] AS arr, -- 返回[1,2] arr[2] AS nested_elem; -- 返回2 ``` 结果: ``` ┌─arr─────┬─nested_elem─┐ │ [1,2] │ 2 │ └─────────┴─────────────┘ ``` #### 示例4:结合表查询(引用[4]表结构) ```sql -- 创建表(参考引用[4]) CREATE TABLE user_data ( id Int32, tags Array(String) ) ENGINE = TinyLog; INSERT INTO user_data VALUES (1, ['VIP','New']), (2, ['Standard']); -- 提取每个用户的第一个标签 SELECT id, tags[1] AS primary_tag FROM user_data; ``` 结果: ``` ┌─id─┬─primary_tag─┐ │ 1 │ VIP │ │ 2 │ Standard │ └────┴─────────────┘ ``` #### 示例5:动态索引计算 ```sql SELECT arrayElement(['x','y','z'], 1+1) AS calc_index; -- 返回'y' ``` --- ### 注意事项 1. **索引必须为整数**:浮点数会被向下取整(`[10,20][1.9]` → `10`) 2. **性能优化**:在`JOIN`操作前过滤数组可提升性能(参考引用[3]) 3. **类型一致性**:如引用[2]所述,枚举类型会按数值处理 4. **并发限制**:使用`TinyLog`引擎时注意写并发(参考引用[4]) --- ### 常见问题场景 1. **处理空数组**:`SELECT [] [1]` → 返回0(数值)或`''`(字符串) 2. **Nullable处理**:结合引用[5]的类型转换: ```sql SELECT arrayElement(CAST([NULL, 5] AS Array(Nullable(Int8))), 2) -- 返回5(Nullable类型) ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值