无法读取JS中的属性“长度”错误

时间:2018-11-27 18:26:15

标签: javascript

我有一个日期范围数组,我需要弄清那几个月之间的天数之差,然后创建一个数组。

10/05/2015 - 11/05/2015 = 30 days
11/05/2015 - 12/ 05/2015 = 31 days
[30,31....]

对于日期范围,我有以下代码。

function createLedger(stDate, etDate) {

  if (stDate && etDate) {
    var endOfLeaseDate = moment(etDate, "MM/DD/YYYY");
    var startOfLeaseDate = moment(stDate, "MM/DD/YYYY");
    dateRange(startOfLeaseDate, endOfLeaseDate);
  }
}

function dateRange(stDate, etDate) {
  var dates = [];

  var now = stDate.clone();
  var day = stDate.date();

  while (now.isBefore(etDate)) {
    //deal with variable month end days
    var monthEnd = now.clone().endOf("month");
    if (now.date() < day && day <= monthEnd.date()) {
      now.date(day);
    }

    dates.push(now.format("MM/DD/YYYY"));
    now = now.clone().add({
      "months": 1
    });
  }
  return dates;
}

function daysBetween(date1, date2) {
  var Diff = Math.abs(date2.getTime() - date1.getTime());
  var TimeDifference = Math.round(Diff / (1000 * 3600 * 24));
  return TimeDifference;
}

function RunLedgerAndPV() {
  var pDate = "11/21/2018"
  var stDate = "10/5/2015";
  var etDate = "12/4/2019";
  var dateArr = createLedger(stDate, etDate);
   
  var dayCounts = "";
  for (var x = 0; x < dateArr.length; x++) {
    dayCounts += daysBetween(dateArr[x], dateArr[x + 1], ",");
  }
  console.log(dayCounts);
}
RunLedgerAndPV();
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>

由于某种原因,它在dateArr.length上引发了错误。不知道我在这里做错了什么。任何帮助表示赞赏。谢谢。

2 个答案:

答案 0 :(得分:1)

在函数“ crrateLedger”中,您不会返回任何内容,而是在“ var dateArr”中进行分配,因此它被javascript设置为undefined,并且您正尝试访问未定义的dateArr属性长度

答案 1 :(得分:1)

要添加到Vijay,您也不会在dateRange()中返回任何内容。返回日期数组,然后返回调用dateRange()的位置。

请注意,在调用daysBetweenArrears时,这会导致更多错误与您对daysBetween函数的命名有关。

编辑 其他错误: 您正在对字符串调用getTime(),因此会导致错误。您需要使用new Date(date2) - new Date(date1)转换为日期对象。

“运行”功能也缺少另一个回报。

以下代码:

function createLedger(stDate, etDate) {
  if (stDate && etDate) {

    var endOfLeaseDate = moment(etDate, "MM/DD/YYYY");
    var startOfLeaseDate = moment(stDate, "MM/DD/YYYY");
    return dateRange(startOfLeaseDate, endOfLeaseDate); // Added return
  }
}

function dateRange(stDate, etDate) {
  var dates = [];

  var now = stDate.clone();
  var day = stDate.date();

  while (now.isBefore(etDate)) {
    //deal with variable month end days
    var monthEnd = now.clone().endOf("month");
    if (now.date() < day && day <= monthEnd.date()) {
      now.date(day);
    }

    dates.push(now.format("MM/DD/YYYY"));
    now = now.clone().add({
      "months": 1
    });
  }
  return dates; // Added return

}

function daysBetween(date1, date2) {
  var Diff = Math.abs(new Date(date2).getTime() - new Date(date1).getTime()); // Used new Date()
  var TimeDifference = Math.round(Diff / (1000 * 3600 * 24));
  return TimeDifference;
}

function RunLedgerAndPV() {
  var pDate = "11/21/2018"
  var stDate = "10/5/2015";
  var etDate = "12/4/2019";
  var dateArr = createLedger(stDate, etDate);


  var dayCounts = "";
  for (var x = 0; x < dateArr.length; x++) {
    dayCounts += daysBetween(dateArr[x], dateArr[x + 1]) + ' '; // added a + ' ' to add a space to the result. Removed the ',' that you were adding in daysBetween but not using
  }
  return dayCounts; // Added return
}

RunLedgerAndPV(); //This wont show anything so wrap it in a console.log to see it return what you need