如何按自定义时长逻辑对JavaScript对象数组进行排序?
问题排查与修复方案
原代码存在的问题
- 三元运算符优先级错误:未给每个三元运算结果加括号,导致加法运算先于三元判断执行,计算逻辑完全混乱。
- 字符串长度调用错误:
first.excerpt.length()是错误写法,字符串长度是属性而非方法,应使用first.excerpt.length。 - 排序函数逻辑不完整:仅处理了第一个值大于第二个值的场景(返回-1),未覆盖小于(返回1)和等于(返回0)的情况,导致排序结果不稳定甚至无效。
- 视频时长计算逻辑错误:第二个对象的视频判断写成
second.video * min ? second.length,不仅优先级错误,逻辑也和第一个对象不一致,应统一为second.video ? second.length * min : 0。 - 空值判断不准确:仅用
first.audio判断是否存在音频,空字符串会被视为false,需用first.audio.trim() !== ''准确判断是否有有效音频链接。
正确实现代码
if (sort.value.toLowerCase() === mediaSortItems.Length) { const min = 60; const averageWordsPerMinute = 250; // 封装权重计算逻辑,复用代码 const calculateWeight = (frontmatter) => { // 音频权重:有有效音频则计入时长,否则为0 const audioWeight = frontmatter.audio?.trim() ? frontmatter.length * min : 0; // 视频权重:有有效视频则计入时长,否则为0 const videoWeight = frontmatter.video?.trim() ? frontmatter.length * min : 0; // 摘录阅读时长权重:字符长度除以每分钟平均阅读字数 const excerptWeight = frontmatter.excerpt.length / averageWordsPerMinute; return audioWeight + videoWeight + excerptWeight; }; // 按权重降序排序 return posts.sort((a, b) => { const weightA = calculateWeight(a.node.frontmatter); const weightB = calculateWeight(b.node.frontmatter); if (weightA > weightB) return -1; if (weightA < weightB) return 1; return 0; }); }
代码说明
- 提取权重计算函数:将重复的计算逻辑封装成
calculateWeight,提升代码可读性与可维护性。 - 准确判断媒体有效性:用
?.trim()处理空值或undefined,确保只有有效链接才计入权重。 - 完整排序逻辑:覆盖大于、小于、等于三种场景,保证排序结果稳定符合预期。
- 修正字符串长度调用:使用
length属性替代错误的方法调用。
内容的提问来源于stack exchange,提问作者Anas Naser
相关产品推荐
相关产品推荐

