You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用JavaScript的QuickSort按指定属性顺序排序对象数组

解决方法

你的核心问题是快排函数没有接收自定义比较函数作为参数,同时当前的颜色比较函数返回值不符合排序逻辑要求,下面是具体的修改和结合步骤:

1. 修正颜色比较函数

你当前的comparationColor返回布尔值,但标准排序比较函数需返回数值:

  • 若fruit1应排在fruit2前,返回负数
  • 若两者顺序无关,返回0
  • 若fruit1应排在fruit2后,返回正数

修改后的代码:

const comparationColor = (fruit1, fruit2) => {
  const priority = ['violet', 'indigo', 'blue', 'green', 'yellow', 'orange', 'red'];
  const priority1 = priority.indexOf(fruit1.color);
  const priority2 = priority.indexOf(fruit2.color);
  // 返回优先级差值,符合排序比较逻辑
  return priority1 - priority2;
};

2. 修改快排函数,支持传入比较函数

让quickSort接受第二个参数compareFn,默认提供通用升序逻辑,让函数更灵活:

function quickSort(arr, compareFn) {
  // 默认比较函数:适配数字/字符串的升序排序
  const defaultCompare = (a, b) => {
    if (a < b) return -1;
    if (a > b) return 1;
    return 0;
  };
  const compare = compareFn || defaultCompare;

  if (arr.length < 2) {
    return arr;
  }
  
  const pivot = arr[0];
  const leftArr = [];
  const rightArr = [];

  for (let i = 1; i < arr.length; i++) {
    // 使用传入的比较函数判断元素归属
    if (compare(arr[i], pivot) < 0) {
      leftArr.push(arr[i]);
    } else {
      rightArr.push(arr[i]);
    }
  }
  return [...quickSort(leftArr, compare), pivot, ...quickSort(rightArr, compare)];
}

这里调整了判断逻辑:从comparation(pivot, arr[i])改为compare(arr[i], pivot) < 0,匹配我们修改后的比较函数返回值逻辑——当元素优先级小于基准值时,放入左数组。

3. 结合调用示例

现在可以直接传入水果数组和颜色比较函数完成排序:

// 示例水果数组
const fruits = [
  { kind: 'apple', color: 'red' },
  { kind: 'orange', color: 'orange' },
  { kind: 'watermelon', color: 'green' },
  { kind: 'blueberry', color: 'blue' }
];

// 执行排序
const sortedFruits = quickSort(fruits, comparationColor);
console.log(sortedFruits);
// 输出顺序:blueberry(blue) → watermelon(green) → orange(orange) → apple(red)
// 完全匹配彩虹颜色顺序:violet → indigo → blue → green → yellow → orange → red

关键说明

  • 让快排函数接收比较函数参数,是为了让它支持任意类型数据的排序,不局限于水果对象的颜色排序场景
  • 修正比较函数返回值,是为了贴合JavaScript排序逻辑的标准规范,避免出现排序结果异常的问题

内容的提问来源于stack exchange,提问作者user25296678

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 03:06:16