You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按自定义时长逻辑对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;
  });
}

代码说明

  1. 提取权重计算函数:将重复的计算逻辑封装成calculateWeight,提升代码可读性与可维护性。
  2. 准确判断媒体有效性:用?.trim()处理空值或undefined,确保只有有效链接才计入权重。
  3. 完整排序逻辑:覆盖大于、小于、等于三种场景,保证排序结果稳定符合预期。
  4. 修正字符串长度调用:使用length属性替代错误的方法调用。

内容的提问来源于stack exchange,提问作者Anas Naser

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 12:45:44