在我目前的项目中,我经常需要知道给定间隔内数字的位置(并且它需要基于1,而不是基于0)。让我们以转换时间为例 - 从基于0的24小时时钟到基于1的12小时时钟(因此12是间隔)。给定2小时或14小时,'位置'应为2.给定0或12,位置等于12(不是0)。
显而易见的方法是模数 - 14 % 12 = 2
如预期的那样。但是,12 % 12 = 0
,就像我说的那样,它需要基于1。我不能只将模数的结果加1来使它从1开始,因为那时间隔12中12的位置将是1,12中14的位置将是3,依此类推。
我想出了两种方法来解决这个问题:
position = value % interval || interval
(依赖假名0)position = (value - 1) % interval + 1
(或者如果你需要支持从0开始的值,就像在24小时制中那样,那将是(value + interval - 1)
)应该使用以下哪种方法? 我应该注意哪些利弊/潜在的陷阱? 或者有一种我不知道的更好的方法吗?
答案 0 :(得分:0)
因此,基于我收到的评论,我最初提出的两种方法都缺乏类型检查以及它们如何处理零或负数。基于该反馈,我将我的功能更改为以下内容:
function positionInInterval( value, interval ) {
// Check for valid input
// Rather than throw an error, you could return undefined or NaN
if ( typeof value !== 'number' || typeof interval !== 'number' )
throw new TypeError('Argument type must be Number');
if ( interval < 2 )
throw new RangeError('Interval must be greater than 1');
if ( value < 0 )
return value % interval + interval;
return value % interval || interval;
}
它将所有数字视为连续的数字行,包括负数,以便通过将value
增加1,其位置为&#39;在interval
中总是增加1,直到下一个间隔。
注意:用户Slai表示||
可能会使方法1略慢于方法2,但至少在Chrome中,它们似乎是颈部和颈部, 除了,当我用value
确定Math.random()
时,||
总是稍快一些。
我知道与此问题相关的用例是有限的,但我希望它可以帮助某人!在我偶然发现之前,这是我从未知道的那种信息。 :)