Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/477.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么数组引用号会切换为字符串?_Javascript_Google Apps Script - Fatal编程技术网

Javascript 为什么数组引用号会切换为字符串?

Javascript 为什么数组引用号会切换为字符串?,javascript,google-apps-script,Javascript,Google Apps Script,我发现了引用的问题,但我不明白现在发生了什么。数组已正确填充,但我不明白为什么无法提取值。然后,经过一些尝试和错误,我在最后发现,如果我用引号关闭数组引用值,它将返回正确的值。为什么在使用整数创建引用时将其转换为字符串 function initPPArray(year) { var beginningOfYear = new Date('January 1, 2014'); var dayOffset = (beginningOfYear.getDay() + 6) % 7;

我发现了引用的问题,但我不明白现在发生了什么。数组已正确填充,但我不明白为什么无法提取值。然后,经过一些尝试和错误,我在最后发现,如果我用引号关闭数组引用值,它将返回正确的值。为什么在使用整数创建引用时将其转换为字符串

    function initPPArray(year) {
  var beginningOfYear = new Date('January 1, 2014');
  var dayOffset = (beginningOfYear.getDay() + 6) % 7;

  var beginningOfPP = new Date(beginningOfYear.getFullYear(), beginningOfYear.getMonth(), beginningOfYear.getDate() - dayOffset);
  var payPeriodList = [];
  payPeriodList[1] = {};
  payPeriodList[1].start = beginningOfPP;
  payPeriodList[1].end = new Date(beginningOfPP.getFullYear(), beginningOfPP.getMonth(), beginningOfPP.getDate() + 13);
  Logger.log('beginningOfPP: ' + beginningOfPP);

  var txtStart = getMonthString(payPeriodList[1].start) + ", " + payPeriodList[1].start.getDate();
  var txtEnd = getMonthString(payPeriodList[1].end) + ", " + payPeriodList[1].end.getDate();
  Logger.log("PP 1: " + txtStart + " - " + txtEnd);
  for (var i = 2; i <= 26; i++) {
    payPeriodList[i] = {};
    payPeriodList[i].start = new Date(payPeriodList[i-1].end.getFullYear(), payPeriodList[i-1].end.getMonth(), payPeriodList[i-1].end.getDate() + 1);
    payPeriodList[i].end = new Date(payPeriodList[i].start.getFullYear(), payPeriodList[i].start.getMonth(), payPeriodList[i].start.getDate() + 13);
    var txtStart = getMonthString(payPeriodList[i].start) + ", " + payPeriodList[i].start.getDate();
    var txtEnd = getMonthString(payPeriodList[i].end) + ", " + payPeriodList[i].end.getDate();
    Logger.log("PP: " + i + ": " + txtStart + " - " + txtEnd);
  }
  // This returns the proper value.. when no quotes are used it returns  
  // the last date of the loop "Dec 15,2014"
  Logger.log("Random Value: " + payPeriodList["6"].start)
  return payPeriodList;
} 
函数初始数组(年){
var BeginingOfyear=新日期(“2014年1月1日”);
var dayOffset=(beginingofyear.getDay()+6)%7;
var beginningOfPP=新日期(beginningOfYear.getFullYear()、beginningOfYear.getMonth()、beginningOfYear.getDate()-dayOffset);
var payPeriodList=[];
payPeriodList[1]={};
payPeriodList[1]。开始=开始FPP;
payPeriodList[1]。end=新日期(beginningOfPP.getFullYear()、beginningOfPP.getMonth()、beginningOfPP.getDate()+13);
Logger.log('beginingofpp:'+beginingofpp);
var txtStart=getMonthString(payPeriodList[1]。start)+“,”+payPeriodList[1]。start.getDate();
var txtEnd=getMonthString(payPeriodList[1].end)+“,“+payPeriodList[1].end.getDate();
Logger.log(“第1页:“+txtStart+”-“+txtEnd”);

对于JavaScript中的(var i=2;i数组,以索引
0
开始,而不是索引
1
。因此此代码:

var payPeriodList = new Array();
payPeriodList[1] = {
    // ...
};
…将
0th
项留空,同时使数组的长度
2
(因为标准JavaScript数组本身就是稀疏的,因为它们本身就是稀疏的)。一旦这样做了,由于在后续代码中使用了
push
,因此第一个条目永远不会填充

1
更改为
0
,或使用
push
作为第一个条目(与后续条目相同)


旁注:使用数组文字创建数组几乎总是更好的,而不是
new array()


我认为您的问题在于payPeriodList数组中的每个项目都是对同一对象(payPeriodItem)的引用。通过分配数组的每次迭代都会更改payPeriodItem的起始值和结束值,而不是创建具有新起始值和结束值的新对象。因此,要解决此问题,您只需更改for循环中的第一行即可将新对象分配给payPeriodList[i]

for (var i = 2; i <= 26; i++) {
    payPeriodList[i] = {};
    /*...*/
}

for(var i=2;我使用了数组文本,但通过搜索,我尝试了几种变体。我将尝试清理代码并使用您的建议。我从“1”开始使用payPeriodList因为我将使用索引作为相应的付款期编号。这不是您要问的,但您可以用一行替换23行
switch
语句:
var dayOffset=(beginingofyear.getDay()+6)%7;
当然有用。谢谢你的提示。这是我的第一个编程项目,所有东西都是自学的。我会采纳我能得到的任何建议。这给了我同样的结果。数组正在填充。我只是不知道数组索引为什么会变成字符串。如果我这样做,我只能回忆一个值:payPeriodList(“6”)你确定数组正在填充吗?我已经复制了你的代码并放置了console.log(payPeriodList[“6”]==payPeriodList[6])在return语句之前,它的计算结果为true。我不知道为什么一个人可以使用stringed int访问数组元素,但我不知道如何为这两个元素获取不同的值。现在可以这样做了。我不明白。昨晚我在这个问题上纠结了几个小时,除非数组索引是字符串,否则我无法获取正确的值。你知道吗r建议很好用,我又回到了原来的建议,也很好用。Wtf?
for (var i = 2; i <= 26; i++) {
    payPeriodList[i] = {};
    /*...*/
}