当前位置:首页 > JavaScript

js实现链式排序

2026-04-04 14:38:26JavaScript

链式排序的实现方法

链式排序允许通过连续调用多个排序条件对数组进行多级排序。以下是几种实现方式:

js实现链式排序

使用 Array.prototype.sort 和链式调用

const data = [
  { name: 'Alice', age: 25, score: 90 },
  { name: 'Bob', age: 30, score: 85 },
  { name: 'Alice', age: 20, score: 95 }
];

function chainSort(arr) {
  let sortFunctions = [];

  const sorter = {
    by: function(prop, direction = 'asc') {
      sortFunctions.push((a, b) => {
        if (a[prop] < b[prop]) return direction === 'asc' ? -1 : 1;
        if (a[prop] > b[prop]) return direction === 'asc' ? 1 : -1;
        return 0;
      });
      return this;
    },
    execute: function() {
      return arr.slice().sort((a, b) => {
        for (const fn of sortFunctions) {
          const result = fn(a, b);
          if (result !== 0) return result;
        }
        return 0;
      });
    }
  };

  return sorter;
}

// 使用示例
const sorted = chainSort(data)
  .by('name')
  .by('age', 'desc')
  .by('score', 'asc')
  .execute();

使用函数式编程风格

function createSorter(...sorters) {
  return (a, b) => {
    for (const sorter of sorters) {
      const result = sorter(a, b);
      if (result !== 0) return result;
    }
    return 0;
  };
}

const byName = (a, b) => a.name.localeCompare(b.name);
const byAgeDesc = (a, b) => b.age - a.age;
const byScore = (a, b) => a.score - b.score;

const sorter = createSorter(byName, byAgeDesc, byScore);
const sorted = [...data].sort(sorter);

使用 ES6 类实现

class ChainSorter {
  constructor(arr) {
    this.arr = arr;
    this.sorters = [];
  }

  by(prop, direction = 'asc') {
    this.sorters.push((a, b) => {
      if (a[prop] < b[prop]) return direction === 'asc' ? -1 : 1;
      if (a[prop] > b[prop]) return direction === 'asc' ? 1 : -1;
      return 0;
    });
    return this;
  }

  execute() {
    return [...this.arr].sort((a, b) => {
      for (const sorter of this.sorters) {
        const result = sorter(a, b);
        if (result !== 0) return result;
      }
      return 0;
    });
  }
}

// 使用示例
const sorter = new ChainSorter(data);
const result = sorter
  .by('name')
  .by('age', 'desc')
  .execute();

实现要点

  1. 链式调用通过在每个方法中返回this实现
  2. 多级排序通过维护排序函数数组实现
  3. 每次排序比较时按顺序应用所有排序条件
  4. 原始数组不会被修改,执行时创建副本
  5. 支持升序和降序两种排序方向

这些方法都可以根据实际需求进行扩展,比如添加自定义比较函数、支持更复杂的排序逻辑等。

标签: 链式js
分享给朋友:

相关文章

js实现拖拽

js实现拖拽

实现拖拽的基本步骤 使用JavaScript实现拖拽功能需要监听鼠标事件,包括mousedown、mousemove和mouseup。以下是实现的基本逻辑: const draggableEleme…

js实现轮播图

js实现轮播图

基础轮播图实现 使用HTML、CSS和JavaScript实现一个简单的自动轮播图。HTML结构包含一个容器和多个图片项。 <div class="slider"> <div…

js 实现继承

js 实现继承

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

js实现瀑布流

js实现瀑布流

实现瀑布流布局 瀑布流布局是一种常见的网页布局方式,常用于图片展示、商品列表等场景。以下是使用 JavaScript 实现瀑布流布局的几种方法。 纯 JavaScript 实现 通过计算元素的位置和…

使用js实现

使用js实现

使用JavaScript实现 JavaScript可以通过Math.random()函数生成随机数,结合其他方法可以实现多种随机数生成需求。 // 生成0到1之间的随机小数 const random…

js实现图

js实现图

JavaScript 实现图的常用方法 在 JavaScript 中,图(Graph)可以通过多种方式实现,常见的包括邻接表(Adjacency List)和邻接矩阵(Adjacency Matrix…