我要返回2个值之间的差怎么办? 0.0.0.1.0和0.0.0.1.12
所以这两个值的差是12 所以如何计算我尝试过使用Math.abs()的方法,但是只用一位数字就可以了。
答案 0 :(得分:1)
假设它们是字符串(因为在有效的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 versions),则建议您不要这样做,因为此功能始终会发现方案的情况,例如预发布版本将不只包含数字,而是{{ 1}}之类的东西。由于我不知道您要做什么,因此我将由您负责:)