1 回答

TA贡献1827条经验 获得超4个赞
假设它们是字符串(因为在一个有效的 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其他内容。因为我不知道你到底想做什么,所以我会把这个责任留给你去弄清楚:)
添加回答
举报