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

对象数组QuickSort排序失败,如何正确使用array[0][prop]作为基准?

问题:快速排序函数无法按对象指定属性排序

我编写了一个quickSort函数,希望对对象数组按指定属性(比如'motor')排序,但无法正常工作。尝试使用array[0][prop]作为基准值也没解决问题。

我的代码如下:

function quickSort(array, prop) {
    if (array.length <= 1) return array;

    const pivot = array[0]; // 我尝试过用array[0][prop]但无效
    const left = [];
    const right = [];

    for (let i = 1; i < array.length; i++) {
        if (array[i][prop] < pivot) {
            left.push(array[i]);
        } else {
            right.push(array[i]);
        }
    }

    return [...quickSort(left), pivot, ...quickSort(right)];
}
console.log(quickSort(data, 'motor'));

待排序的对象数组:

let data = [
    {
        "color": "A",
        "door": 1,
        "wheel": 3,
        "year": 1963,
        "brand": "GMC",
        "sold": false,
        "owner": "Chalmers Boobyer",
        "motor": 2.6,
        "assembled": "20/08/2021"
    },
    {
        "color": "B",
        "door": 2,
        "wheel": 2,
        "year": 1980,
        "brand": "Ford",
        "sold": false,
        "owner": "Angelia Cromett",
        "motor": 2.5,
        "assembled": "02/05/2021"
    },
    {
        "color": "C",
        "door": 3,
        "wheel": 1,
        "year": 1999,
        "brand": "Audi",
        "sold": false,
        "owner": "Barth Pickring",
        "motor": 2.0,
        "assembled": "15/02/2021"
    },
    {
        "color": "D",
        "door": 4,
        "wheel": 1,
        "year": 2008,
        "brand": "Hyundai",
        "sold": true,
        "owner": "Aurore Soaper",
        "motor": 1.2,
        "assembled": "02/01/2019"
    }
];

修复方案

你的代码存在两个关键错误:

  1. 比较逻辑错误:你将pivot设为整个对象,但比较时用当前元素的属性值(数值)和整个对象对比,类型不匹配导致排序逻辑失效。
  2. 递归参数缺失:递归调用quickSort时未传递prop参数,内层函数无法获知要按哪个属性排序。

修复后的代码如下:

function quickSort(array, prop) {
    if (array.length <= 1) return array;

    const pivot = array[0]; // 保留完整对象作为基准元素
    const left = [];
    const right = [];

    for (let i = 1; i < array.length; i++) {
        // 关键:用基准对象的目标属性值进行比较
        if (array[i][prop] < pivot[prop]) {
            left.push(array[i]);
        } else {
            right.push(array[i]);
        }
    }

    // 递归时必须传递prop参数
    return [...quickSort(left, prop), pivot, ...quickSort(right, prop)];
}

console.log(quickSort(data, 'motor'));

说明

  • 保留pivot为完整对象,确保最终返回的是原结构的对象数组。
  • 比较时使用pivot[prop]获取基准值,和当前元素的array[i][prop]进行数值对比,保证逻辑正确。
  • 递归调用时传递prop参数,让每一层排序都明确目标属性。

执行后,数组会按motor属性从小到大排序,输出结果为:

[
  { color: 'D', door: 4, wheel: 1, year: 2008, brand: 'Hyundai', sold: true, owner: 'Aurore Soaper', motor: 1.2, assembled: '02/01/2019' },
  { color: 'C', door: 3, wheel: 1, year: 1999, brand: 'Audi', sold: false, owner: 'Barth Pickring', motor: 2.0, assembled: '15/02/2021' },
  { color: 'B', door: 2, wheel: 2, year: 1980, brand: 'Ford', sold: false, owner: 'Angelia Cromett', motor: 2.5, assembled: '02/05/2021' },
  { color: 'A', door: 1, wheel: 3, year: 1963, brand: 'GMC', sold: false, owner: 'Chalmers Boobyer', motor: 2.6, assembled: '20/08/2021' }
]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 15:45:34