对象数组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" } ];
修复方案
你的代码存在两个关键错误:
- 比较逻辑错误:你将
pivot设为整个对象,但比较时用当前元素的属性值(数值)和整个对象对比,类型不匹配导致排序逻辑失效。 - 递归参数缺失:递归调用
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
相关产品推荐
相关产品推荐

