JavaScript .sort()多字段排序:让undefined始终排在前列
多字段排序时让undefined始终排在前列的解决方案
升序排序代码
针对你的需求,修改排序比较函数,在每个字段比较前先处理undefined的情况,确保其无论升序降序都排在最前面:
[{id: "1", label: "Z", code: "Z"}, {id: "1", code: "A"}, {id: "2", label: "A"}, {id: "3", label: "A", code: "A"}] .sort((a, b) => { // 比较id字段 if (a.id !== undefined && b.id !== undefined) { const idDiff = a.id.localeCompare(b.id); if (idDiff !== 0) return idDiff; } else if (a.id === undefined) { return -1; // undefined排在前面 } else if (b.id === undefined) { return 1; } // 比较label字段 if (a.label !== undefined && b.label !== undefined) { const labelDiff = a.label.localeCompare(b.label); if (labelDiff !== 0) return labelDiff; } else if (a.label === undefined) { return -1; } else if (b.label === undefined) { return 1; } // 比较code字段 if (a.code !== undefined && b.code !== undefined) { return a.code.localeCompare(b.code); } else if (a.code === undefined) { return -1; } else { return 1; } });
降序排序代码
如果需要降序,只需将localeCompare的参数调换(或对结果取反),undefined的处理逻辑保持不变,确保它依然排在前列:
[{id: "1", label: "Z", code: "Z"}, {id: "1", code: "A"}, {id: "2", label: "A"}, {id: "3", label: "A", code: "A"}] .sort((a, b) => { // 比较id字段(降序) if (a.id !== undefined && b.id !== undefined) { const idDiff = b.id.localeCompare(a.id); if (idDiff !== 0) return idDiff; } else if (a.id === undefined) { return -1; // undefined排在前面 } else if (b.id === undefined) { return 1; } // 比较label字段(降序) if (a.label !== undefined && b.label !== undefined) { const labelDiff = b.label.localeCompare(a.label); if (labelDiff !== 0) return labelDiff; } else if (a.label === undefined) { return -1; } else if (b.label === undefined) { return 1; } // 比较code字段(降序) if (a.code !== undefined && b.code !== undefined) { return b.code.localeCompare(a.code); } else if (a.code === undefined) { return -1; } else { return 1; } });
逻辑说明
- 每个字段的比较都优先处理
undefined:只要某对象的字段是undefined,就直接让它排在非undefined对象的前面 - 仅当两个对象的当前字段都有值时,才调用
localeCompare进行字符串排序 - 多字段排序通过短路逻辑实现:前一个字段比较结果非0时,直接返回结果,不再比较后续字段
内容的提问来源于stack exchange,提问作者zzzzz
相关产品推荐
相关产品推荐

