
本文介绍在 javascript 中对嵌套数组中的对象按 `tariffid` 字段实现**条件升序排序**:常规项(7201/7202/7203/7205)按数值升序排列,而特定值 `7204` 始终排在末尾。
在实际业务开发中,常需对嵌套结构(如 obj.others 数组)进行非标准排序——并非简单升序或降序,而是满足“某几个值优先,某一个值强制置后”的定制逻辑。本例要求:所有 tariffId 为 7204 的对象必须位于其所在 others 子数组的最后一位,其余项(如 7201, 7202, 7203, 7205)则按数值严格升序排列。
关键在于重写 .sort() 的比较函数,使其具备三态逻辑:
- 若 a.tariffId === 7204 → 将 a 排至右侧(返回 1);
- 若 b.tariffId === 7204 → 将 b 排至右侧(返回 -1);
- 否则,执行常规数值比较:a.tariffId - b.tariffId。
注意:.sort() 是原地排序,会直接修改原数组。若需保留原始数据,应先深拷贝 others 数组(例如使用 structuredClone() 或扩展运算符)。
以下是完整可运行示例:
const arrobj = [
{ id: 1, others: [{ place: "IN", tariffId: 7201 }, { place: "IN", tariffId: 7204 }, { place: "IN", tariffId: 7203 }] },
{ id: 1, others: [{ place: "IN", tariffId: 7201 }, { place: "IN", tariffId: 7204 }, { place: "IN", tariffId: 7205 }] },
{ id: 1, others: [{ place: "IN", tariffId: 7202 }, { place: "IN", tariffId: 7204 }, { place: "IN", tariffId: 7201 }] }
];
// ✅ 安全排序:对每个 others 数组独立排序,7204 永远置尾
arrobj.forEach(obj => {
obj.others.sort((a, b) => {
if (a.tariffId === 7204) return 1;
if (b.tariffId === 7204) return -1;
return a.tariffId - b.tariffId;
});
});
console.log(arrobj);
// 输出符合预期:每组 others 中 7204 均在末位,其余升序? 进阶提示:若排序规则更复杂(如多值置后、动态优先级列表),可封装为可复用函数:
function sortByCustomOrder(arr, key, lastValues = [7204]) {
const isLast = v => lastValues.includes(v);
return arr.sort((a, b) => {
const aVal = a[key], bVal = b[key];
if (isLast(aVal)) return 1;
if (isLast(bVal)) return -1;
return aVal - bVal;
});
}
// 使用示例
obj.others = sortByCustomOrder([...obj.others], 'tariffId', [7204]);总结:定制排序的核心是控制比较函数的返回值逻辑;务必注意原地修改风险;对于复杂场景,建议解耦排序逻辑以提升可维护性与复用性。










