为了账号安全,请及时绑定邮箱和手机立即绑定

如何找到两个值之间的差异?

如何找到两个值之间的差异?

肥皂起泡泡 2021-12-23 15:53:35
我想返回两个值之间的差异怎么做?0.0.0.1.0 和 0.0.0.1.12所以这两个值之间的差是 12,所以我用 Math.abs() 尝试过如何计算,但用个位数就可以了。
查看完整描述

1 回答

?
GCT1015

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其他内容。因为我不知道你到底想做什么,所以我会把这个责任留给你去弄清楚:)


查看完整回答
反对 回复 2021-12-23
  • 1 回答
  • 0 关注
  • 183 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号