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

如何基于当前版本筛选对象键值并实现分组求和?

解决方案

要实现这个需求,核心是正确比较语义化版本号,并遍历所有版本数据做条件累加。以下是具体实现步骤和代码:

1. 实现版本号比较函数

语义化版本号(如4.1.0)不能直接用字符串比较(比如"4.10.0"字符串会被误判为小于"4.2.0"),需要拆分为数字数组逐个比较:

function compareSemVer(v1, v2) {
  const v1Parts = v1.split('.').map(Number);
  const v2Parts = v2.split('.').map(Number);
  
  for (let i = 0; i < Math.max(v1Parts.length, v2Parts.length); i++) {
    const num1 = v1Parts[i] || 0;
    const num2 = v2Parts[i] || 0;
    if (num1 > num2) return 1;
    if (num1 < num2) return -1;
  }
  return 0; // 版本相等
}

2. 遍历版本数据并求和

初始化两个累加变量,遍历versionResults的所有键值对,用上面的比较函数判断版本关系,分别累加占比,最后处理小数位数:

const currentVersion = "4.1.0";
const versionResults = {
    "2.29.0": 1.0204081632653061,
    "4.0.0": 1.0204081632653061,
    "4.1.0": 41.83673469387756,
    "4.1.1": 56.12244897959188
};

let aboveOrEqual = 0;
let lessThan = 0;

// 遍历所有版本键值对,替代单个取值的方式
Object.entries(versionResults).forEach(([version, percentage]) => {
  const compareResult = compareSemVer(version, currentVersion);
  if (compareResult >= 0) {
    aboveOrEqual += percentage;
  } else {
    lessThan += percentage;
  }
});

// 格式化结果为两位小数
const results = {
  aboveOrEqualThanCurrentVersion: Math.round(aboveOrEqual * 100) / 100,
  lessThanCurrentVersion: Math.round(lessThan * 100) / 100
};

console.log(results);
// 输出:{ aboveOrEqualThanCurrentVersion: 97.96, lessThanCurrentVersion: 2.04 }

说明

  • 版本比较函数能处理不同长度的版本号(比如4.1和4.1.0会被判定为相等)
  • 用Object.entries()遍历对象的键值对,实现批量处理所有版本数据
  • 用Math.round(num * 100) / 100实现保留两位小数的格式化(如果需要更精确的字符串格式,可替换为num.toFixed(2))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 10:41:16