我已经完成了这个函数,它创建了一个四分之一的数组,倒数x个四分之一,包括指定的四分之一。
数组中的最后一项是参考四分之一。
例如,参考季度2
和9
计数,这将得到[2, 3, 4, 1, 2, 3, 4, 1, 2]
;
我的函数工作,但我想知道,如果有一个更简单,更优雅的解决方案。
下面的代码:/// Counts back x from specified quarter
/// Parameters:
/// @param countFrom -- the reference quarter to count back from
/// @param count -- count
///
/// @returns array -- the array of quarters
function getQuarterList(countFrom, count) {
var ret = [];
for (var i = 0; i < count; i++){
var z = countFrom - i;
while (z < 1) {
z = z + 4;
}
ret.splice(0, 0, z);
}
return ret;
}
var quarterList = getQuarterList(2, 9);
console.log(quarterList);
可以计算起始值
function getQuarterList(countFrom, count) {
var offset = (countFrom - count) % 4 + 4;
return Array.apply(null, { length: count }).map(function (_, i) {
return (i + offset) % 4 + 1;
});
}
console.log(getQuarterList(2, 9));
console.log(getQuarterList(3, 7));
console.log(getQuarterList(1, 2));
console.log(getQuarterList(4, 9));
可以利用映射函数和算术模块操作符。下面是函数的一般化版本:
function getModuleList(countFrom, count, mod) {
var arr = [];
for (var i = 0; i < count; i++){
arr.push(i + countFrom);
}
return arr.map(function(num){ return num % mod || mod });
}
var quarterList = getModuleList(2, 9, 4);
console.log(quarterList);
如果只使用countFrom
作为计数器,则可以省略while
循环:
function getQuarterList(countFrom, count) {
// assert: countFrom ∈ [1..4]
var ret = [];
for (var i = 0; i < count; i++) {
ret.unshift(countFrom)
countFrom--;
if (countFrom < 1)
countFrom += 4;
}
return ret;
}
更简单的方法是计算从哪个值开始,然后使用模块操作符:
function getQuarterList(countFrom, count) {
var ret = [];
var z = (countFrom - count % 4 + 4) % 4;
for (var i = 0; i < count; i++) {
ret.push(++z)
z %= 4;
}
return ret;
}
我将按以下方法做这项工作;
var quarters = (n,m) => Array(...Array(m - m%4 + n%4)).map((e,i) => i%4 + 1)
.slice(this.length-m);
console.log(quarters(2,9));
仔细想想,我相信我找不到比这更实用的了。
var quarters = (n,m) => Array(...Array(m)).map((e,i) => (Math.abs(m%4-n) + i)%4 + 1);
console.log(quarters(1,11));
console.log(quarters(3,7));
console.log(quarters(2,9));