GCT1015
假设它们是字符串(因为在一个有效的 JS 数字中不能有超过 1 个句号),您可以按.字符拆分它并计算各个组件的差异:function numStringDiff(a, b) { // split them on dot characters const aParts = a.split('.'); const bParts = b.split('.'); // loop using longest array length as a container for mapped results return Array(Math.max(aParts.length, bParts.length)).fill(undefined).map((_, i) => { const i1 = parseInt(aParts[i] || 0); // fetch aParts[i] or default to 0 const i2 = parseInt(bParts[i] || 0); // fetch bParts[i] or default to 0 // return compared value after defaulting the values. return i2 - i1; });}console.log(numStringDiff('0.0.0.1.0', '0.0.0.1.12'));这里的问题是,正如您在评论中所述,它们的长度可能不同。为了让它在这种情况下工作,我们必须迭代等于最长数组长度的次数,并确保较短数组中的任何缺失项都默认为某个不间断的值,例如0这样我们可以安全地减去每个数字出现在最长的列表中,带有某物或0。请注意,这0是我仅用于确保您可以计算不同长度数组之间的差异的值,选择适合您需要的任何(数字或浮点)值。如果在这种情况下第二个参数的点数比第一个少,则返回负差,否则如果第一个比最后一个长,将返回正差。一些例子:numStringDiff('1.1.1', '1.1') // => [0, 0, -1]numStringDiff('1.1', '1.1.1') // => [0, 0, 1]numStringDiff('1.1.1', '1.1.1') // => [0, 0, 0]对于两个值之间的绝对距离,可以简单地.map通过这个数组:numStringDiff('1.1.1', '1.1').map(num => Math.abs(num));// OR, using short form: numStringDiff('1.1.1', '1.1').map(Math.abs);最后,如果您需要将结果作为字符串,只需将.join其与'.':numStringDiff('1.1.1', '1.1').map(Math.abs).join('.');知道你想要实现什么。如果您尝试手动平分版本号(如semver 版本),我建议您不要这样做,因为此功能总会发现一些场景,例如预发布版本,不仅包含数字,还包含0.0.0-pre-foo-version其他内容。因为我不知道你到底想做什么,所以我会把这个责任留给你去弄清楚:)