有没有更好的方法来创建一个四分之一的列表,从给定的四分之一开始倒数



我已经完成了这个函数,它创建了一个四分之一的数组,倒数x个四分之一,包括指定的四分之一。

数组中的最后一项是参考四分之一。

例如,参考季度29计数,这将得到[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));

最新更新