使用Lodash sortBy:基于布尔值及附加条件排序数组
解决布尔值+日期条件的数组排序问题
我来帮你梳理下当前代码的问题,然后给出可行的解决方案~
首先,你用的sortBy(应该是Lodash的工具函数吧?)的回调逻辑有点问题:sortBy需要你返回用于排序的权重值,而不是直接返回post对象。你之前的写法里,条件满足时返回post,不满足时默认返回undefined,这种逻辑是不可靠的——因为undefined和对象之间的比较不会按照你预期的规则生效。
你的核心需求应该是:仅当帖子是置顶帖(featured_post === true)且发布日期不早于今天(date >= today)时,把这类帖子排在数组最前面,其他帖子保持原有顺序或按额外规则排序?
那正确的写法应该是给符合双条件的帖子返回更小的排序权重(比如0),不符合的返回更大的权重(比如1),这样sortBy会自动把权重小的内容排到前面:
// 先定义today,注意要确保date的格式和today匹配(比如都是Date对象或时间戳) const today = new Date(); today.setHours(0, 0, 0, 0); // 可选:清零时间部分,只比较日期维度 posts = _.sortBy(posts, [function(post) { // 符合双条件返回0,其余返回1 return (post.featured_post === true && post.date >= today) ? 0 : 1; }]);
如果除了置顶优先级,你还想给剩下的帖子加额外排序规则(比如按发布日期倒序),可以在sortBy的参数数组里再加一个回调:
posts = _.sortBy(posts, [ function(post) { return (post.featured_post === true && post.date >= today) ? 0 : 1; }, function(post) { // 剩余帖子按日期倒序,用负号实现降序逻辑 return -new Date(post.date).getTime(); } ]);
最后补充个小提醒:如果你的post.date是字符串格式,记得先转换成Date对象再和today比较,避免因格式不匹配导致判断错误哦~
内容的提问来源于stack exchange,提问作者Merc
相关产品推荐
相关产品推荐

