javascript对象数组按属性排序需用sort()配自定义比较函数,注意类型处理、空值安全及升降序控制,支持字符串、数字、日期和嵌套属性。

JavaScript 中对对象数组按指定属性排序,主要用 Array.prototype.sort() 配合自定义比较函数实现。关键在于正确处理属性值类型(如字符串、数字、日期)和空值/缺失属性的情况。
基础写法:按字符串或数字属性升序排序
直接访问对象属性,返回差值(数字)或比较结果(字符串):
- 数字属性(如
age):用a.age - b.age - 字符串属性(如
name):用a.name.localeCompare(b.name)(推荐,支持中文和大小写)
示例:
const users = [{name: '张三', age: 25}, {name: '李四', age: 22}];users.sort((a, b) => a.age - b.age); // 按年龄升序
支持降序与动态属性名
把排序字段变成变量,用方括号语法读取属性,并通过乘以 -1 切换升降序:
-
sortObjects(arr, 'price', 'desc')→(a[prop] - b[prop]) * -1 - 字符串字段降序:用
b[prop].localeCompare(a[prop])
通用函数示例:
function sortObjects(arr, prop, order = 'asc') {return arr.sort((a, b) => {
const valA = a[prop];
const valB = b[prop];
if (typeof valA === 'string' && typeof valB === 'string') {
return order === 'asc'
? valA.localeCompare(valB)
: valB.localeCompare(valA);
}
return order === 'asc' ? valA - valB : valB - valA;
});
}
安全处理空值、undefined 或 null
避免 Cannot read property 'xxx' of undefined 错误,先做存在性判断:
- 用可选链
a?.[prop](需环境支持)或a[prop] ?? ''提供默认值 - 把空值统一排在前面或后面:例如
valA == null ? -1 : valB == null ? 1 : ...
健壮版片段:
const valA = a[prop] ?? '';const valB = b[prop] ?? '';
if (valA === '' && valB !== '') return -1;
if (valB === '' && valA !== '') return 1;
按日期或嵌套属性排序
日期字符串(如 '2023-05-12')可直接转为 Date 比较;嵌套属性用点号路径(如 'address.city')需手动解析或用 Lodash 的 get:
- 简单嵌套:
a.address?.city || '' - 日期排序:
new Date(a.date).getTime() - new Date(b.date).getTime()
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











