我正在努力建立一年的员工日程安排,一周中不同的日子需要不同数量的员工。我想将名单输出到Google电子表格
我的方法是拥有一个包含所有员工姓名的数组,然后在一年中的每一天都清空员工数组中的x个名字。 X等于staff.length - 今天需要多少人。
我写了代码,输出不是我的预期。第一天看起来是正确的,但是每隔一天都会返回一个空数组。
var 员工已初始化&在LoC3上分配。但是在LoC12上,当我有职员的日志输出时,我看到一个空数组。我可以看到将一个空数组分配给 rosterToday 的结果是 rosterFull 是空的,但我不明白将员工设置为什么[,,,,,,]
此外,如果我删除了LoC17(rosterToday [i] =“”),员工的幻像重新分配似乎消失了。
有谁知道我在这里做错了什么?
function RosterTest()
{
var staff = ["Adam", "Bob", "Chris", "Dave", "Ed", "Fred", "Garry"];
var dailyRequirement = [0, 6, 7, 7, 7, 6, 2]; // num staff needed today
var rosterFull = []; // push each day's roster in here
var period = 7; // test with only 7 days, then ramp up to 365
for (var d=0; d<period; d++)
{
var rosterToday = staff; // initially start with the full roster
var reduce = staff.length - dailyRequirement[d];
Logger.log("d="+d+" staff="+staff);
// when d>=1 staff becomes [, , , , , , ]
for (var i=0; i<reduce; i++)
{
rosterToday[i] = "";
}
rosterFull.push(rosterToday);
}
for (var i=0; i<rosterFull.length; i++)
{Logger.log(rosterFull[i]);} // shows an arr of len 7 with empty arrs
// spreadsheet.getRange(row, col, height, width).setValues(rosterWeek);
}
我知道这将始终优先考虑人员阵列中的前几名员工,但我已经有代码来改组他们。这只是一些孤立的行。
答案 0 :(得分:0)
我不确定为什么人员阵列似乎是空的,但我认为这可能是尝试将二维数据集分配给一维数组的效果。您希望变量rosterFull包含每天所需的名称。这意味着您需要一个阵列,每天需要7 X的工作人员。
function RosterTest()
{
var staff = ["Adam", "Bob", "Chris", "Dave", "Ed", "Fred", "Garry"];
var dailyRequirement = [0, 6, 7, 7, 7, 6, 2]; // num staff needed today
var period = 7; // test with only 7 days, then ramp up to 365
var rosterFull = new Array(7); // create an array with 7 rows that represent the 7 days of the week
for (var d=0; d<period; d++)
{
var rosterToday = [];
for(var i=0; i<dailyRequirement[d]; i++){
rosterToday[i] = staff[i];
}
rosterFull[d] = rosterToday; //assign the array with the required staff to the corresponding day.
}
}
我不理解变量reduce。这会给你今天不需要的人数,而我想你想要的人数是多少。
答案 1 :(得分:0)
在没有深入了解您所询问的是您实际想要做什么的原因staff
因为该行而在第一次运行后为空的原因
rosterToday = staff;
这会将工作人员指定为对rosterToday的引用 - 因此rosterToday[i]
所做的全部内容也适用于staff
。你需要把rosterToday复制一份。
rosterToday = staff.slice(); //makes a shallow copy of the array
这将解决该特定问题。
除此之外,你还可以使用Array.slice()
var rosterToday = [];
var rosterLength = staff.length;
for (var d = 0; d < dailyRequirement.length; d += 1) {
rosterDay = staff
.slice(0,dailyRequirement[d]-1)
.concat(Array(rosterLength - d));
rosterFull.push(rosterDay)
}
但我不相信这是你想要做的。