如何调整JS数组排序逻辑,将month为00的元素置于同model组末尾?
我现在可以按model和month对cars数组排序,但month值为"00"的元素会排在对应model组的首位,需要把这类元素调整到每组的最后一位。
现有代码
let cars = [{ model: 'Ford', month: '12' }, { model: 'Ford', month: '03' }, { model: 'Ford', month: '01' }, { model: 'Ford', month: '00' }, { model: 'Ford', month: '05' }, { model: 'Fiat', month: '05' }, { model: 'Fiat', month: '01' }, { model: 'Fiat', month: '00' } ]; console.log(`Unsorted cars: ${JSON.stringify(cars)}`); const sorted = cars.sort((a, b) => a.model.localeCompare(b.model) || a.month.localeCompare(b.month)); console.log(`Sorted cars: ${JSON.stringify(sorted)}`);
当前输出
[{"model":"Fiat","month":"00"},{"model":"Fiat","month":"01"},{"model":"Fiat","month":"05"},{"model":"Ford","month":"00"},{"model":"Ford","month":"01"},{"model":"Ford","month":"03"},{"model":"Ford","month":"05"},{"model":"Ford","month":"12"}]
期望输出
[{"model":"Fiat","month":"01"},{"model":"Fiat","month":"05"}, {"model":"Fiat","month":"00"},{"model":"Ford","month":"01"},{"model":"Ford","month":"03"},{"model":"Ford","month":"05"},{"model":"Ford","month":"12"}, {"model":"Ford","month":"00"}]
修改排序逻辑
核心是在同model分组内,单独处理month为"00"的元素:
- 先按
model完成分组排序 - 同model下,若当前元素month为"00",则让它排在后面;若对比元素month为"00",则让当前元素排在前面
- 其余情况按原逻辑比较month的字符串顺序
修改后的排序代码:
const sorted = cars.sort((a, b) => { // 先按model分组排序 const modelCompare = a.model.localeCompare(b.model); if (modelCompare !== 0) { return modelCompare; } // 同model下调整"00"的位置 if (a.month === "00") return 1; if (b.month === "00") return -1; // 正常比较month return a.month.localeCompare(b.month); });
验证结果
运行修改后的代码,输出将与期望完全一致:
[{"model":"Fiat","month":"01"},{"model":"Fiat","month":"05"},{"model":"Fiat","month":"00"},{"model":"Ford","month":"01"},{"model":"Ford","month":"03"},{"model":"Ford","month":"05"},{"model":"Ford","month":"12"},{"model":"Ford","month":"00"}]
内容的提问来源于stack exchange,提问作者asfafafags

