当前位置:首页 > JavaScript

js实现表格排序

2026-04-04 01:09:46JavaScript

实现表格排序的方法

获取表格数据

使用 document.querySelectordocument.getElementById 获取表格元素。通过遍历表格的行和列,将数据提取到一个数组中。

const table = document.getElementById('myTable');
const rows = Array.from(table.querySelectorAll('tr'));
const headers = rows[0].querySelectorAll('th');
const data = rows.slice(1).map(row => {
  const cells = row.querySelectorAll('td');
  return Array.from(cells).map(cell => cell.textContent);
});

排序函数

根据列索引和排序方向(升序或降序)对数据进行排序。可以使用 Array.prototype.sort 方法。

function sortTable(columnIndex, ascending = true) {
  data.sort((a, b) => {
    const valA = a[columnIndex];
    const valB = b[columnIndex];
    if (valA < valB) return ascending ? -1 : 1;
    if (valA > valB) return ascending ? 1 : -1;
    return 0;
  });
}

更新表格

排序完成后,重新渲染表格内容。清空表格的现有行,然后根据排序后的数据重新填充。

js实现表格排序

function updateTable() {
  const tbody = table.querySelector('tbody');
  tbody.innerHTML = '';
  data.forEach(row => {
    const tr = document.createElement('tr');
    row.forEach(cell => {
      const td = document.createElement('td');
      td.textContent = cell;
      tr.appendChild(td);
    });
    tbody.appendChild(tr);
  });
}

添加排序事件

为表头添加点击事件,点击时触发排序并更新表格。可以通过 data-order 属性记录当前排序方向。

headers.forEach((header, index) => {
  header.addEventListener('click', () => {
    const currentOrder = header.getAttribute('data-order');
    const ascending = currentOrder === 'asc' ? false : true;
    sortTable(index, ascending);
    updateTable();
    header.setAttribute('data-order', ascending ? 'asc' : 'desc');
  });
});

完整示例

将上述代码整合为一个完整的实现示例。确保表格具有 id="myTable" 并包含 <thead><tbody> 结构。

js实现表格排序

<table id="myTable">
  <thead>
    <tr>
      <th data-order="asc">Name</th>
      <th data-order="asc">Age</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Alice</td>
      <td>25</td>
    </tr>
    <tr>
      <td>Bob</td>
      <td>30</td>
    </tr>
  </tbody>
</table>

处理数字和日期

对于数字或日期列,排序前需要将字符串转换为相应的类型。修改 sortTable 函数以支持不同类型的数据。

function sortTable(columnIndex, ascending = true) {
  data.sort((a, b) => {
    const valA = isNaN(a[columnIndex]) ? a[columnIndex] : Number(a[columnIndex]);
    const valB = isNaN(b[columnIndex]) ? b[columnIndex] : Number(b[columnIndex]);
    if (valA < valB) return ascending ? -1 : 1;
    if (valA > valB) return ascending ? 1 : -1;
    return 0;
  });
}

性能优化

对于大型表格,可以考虑使用虚拟滚动或分页加载数据。避免频繁操作 DOM,减少重绘和回流。

兼容性

确保代码在现代浏览器中正常运行。如需支持旧版浏览器,可以使用 polyfillBabel 转译代码。

标签: 表格js
分享给朋友:

相关文章

vue实现表格读取数据

vue实现表格读取数据

Vue 实现表格读取数据的方法 使用静态数据 静态数据可以直接在 Vue 组件的 data 中定义,并通过 v-for 指令渲染到表格中。 <template> <table&…

vue实现导出表格

vue实现导出表格

Vue 中实现表格导出 使用 xlsx 库导出 Excel 安装 xlsx 库: npm install xlsx --save 在 Vue 组件中引入并使用: import XLSX from…

js实现vue路由

js实现vue路由

Vue路由基础实现 使用Vue Router实现前端路由需要先安装并配置路由库。Vue Router是Vue.js官方的路由管理器。 安装Vue Router: npm install vue-r…

js实现继承

js实现继承

原型链继承 通过将子类的原型指向父类的实例实现继承。子类实例可以访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Parent…

css好看的表格制作

css好看的表格制作

使用CSS制作美观表格的方法 边框与间距优化 通过border-collapse属性合并边框,避免双边框效果。设置padding增加单元格内边距,提升可读性。 table { border-…

js实现拷贝

js实现拷贝

实现文本拷贝 使用 document.execCommand 方法(已废弃但兼容性较好): function copyText(text) { const textarea = document…