JavaScript如何将noDate为true的数组对象排序到id为2的对象之后
对象数组排序逻辑调整方案
你的核心需求是在原有按date字段升序排序的基础上,新增规则:所有noDate = true的对象必须排在id = 2的对象之后,其余非标记对象保留原有按时间排序的逻辑。
实现代码
首先预处理找到基准的id=2对象,再定义分组排序规则即可:
// 先找到id为2的基准对象 const target = data.find(item => item.id === 2) // 兜底:如果不存在id为2的对象,直接走原有排序逻辑 if (!target) { data.sort((a, b) => new Date(a.date) - new Date(b.date)) } else { const targetTime = new Date(target.date).getTime() data.sort((a, b) => { // 为每个元素定义排序分组,数值越小优先级越高越靠前 const getPriority = (item) => { const itemTime = new Date(item.date).getTime() // 分组1:非noDate、且时间早于基准对象的元素,排在最前面 if (!item.noDate && itemTime < targetTime) return 0 // 分组2:基准对象本身 if (item.id === 2) return 1 // 分组3:非noDate、且时间大于等于基准对象的普通元素 if (!item.noDate) return 2 // 分组4:所有noDate=true的元素,全部排在基准之后 return 3 } const pA = getPriority(a) const pB = getPriority(b) // 优先级不同直接按分组排序 if (pA !== pB) return pA - pB // 同分组内按date升序排序 return new Date(a.date) - new Date(b.date) }) }
逻辑说明
- 所有时间早于id=2对象的普通元素,还是按原有时间顺序排在最前面
- id=2的对象固定在原有时间排序的正确位置
- 时间晚于id=2对象的普通元素,按时间顺序排在基准对象之后
- 所有
noDate=true的元素,不管本身date值是多少,全部排在基准对象之后的最后位置 - 如果需要调整noDate元素和晚于基准的普通元素的前后顺序,只需要调整分组3和分组4的返回数值即可:如果要让noDate排在普通元素前面,把分组3的返回值改成3,分组4改成2即可。
内容的提问来源于stack exchange,提问作者juhend23d
相关产品推荐
相关产品推荐

