如何基于当前版本筛选对象键值并实现分组求和?
解决方案
要实现这个需求,核心是正确比较语义化版本号,并遍历所有版本数据做条件累加。以下是具体实现步骤和代码:
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
相关产品推荐
相关产品推荐

