如何用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
相关产品推荐
相关产品推荐

