如何使用JavaScript的.sort方法按三个条件对对象数组排序
多条件排序实现方案
完全可以通过JavaScript内置的.sort()方法实现该需求,你之前的代码存在三个核心问题:
- 没有遵循
sort比较函数的两两对比逻辑:多条件排序需要按优先级逐层同时对比a、b两个元素的对应字段,仅判断a的属性无法得到正确的排序关系 - 返回值不符合规则:
sort比较函数只需要返回负数(a排在b前)、正数(b排在a前)、0(顺序不变)三类值,自定义返回-2、-3没有实际作用 - 日期字段处理错误:
BirthDate是字符串格式,直接做减法运算会隐式转换为NaN,无法正确对比年龄,需要先转换为日期时间戳再计算
正确实现代码
testlist = testlist.sort((a, b) => { // 优先级1:Relationship为Subscriber的项排最前 const aIsSubscriber = a.Relationship === 'Subscriber' const bIsSubscriber = b.Relationship === 'Subscriber' if (aIsSubscriber && !bIsSubscriber) return -1 if (!aIsSubscriber && bIsSubscriber) return 1 // 优先级2:Active状态排在Inactive之前 if (a.status === 'Active' && b.status === 'Inactive') return -1 if (a.status === 'Inactive' && b.status === 'Active') return 1 // 优先级3:年龄降序,出生时间越早时间戳数值越小,年龄越大 const aTime = new Date(a.BirthDate).getTime() const bTime = new Date(b.BirthDate).getTime() return aTime - bTime })
补充说明:你提供的预期结果中BirthDate: '12/31/1992'的项未在原始输入数组中出现,按你给出的原始数组排序后,Inactive分组的结果为1996年的Daughter、1998年的Son、1999年的Son,完全符合年龄降序的要求。
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

