开发者问题收集

为什么即使我刚刚推送了一个新数组,嵌套数组的长度仍返回未定义?

2021-09-03
590

我已经在 Slack 应用上工作了一段时间。我有一个按钮,它根据人员的用户 ID 和名称创建一个提交 ID,该 ID 将与从未来模式输入中收集的一些其他信息一起推送到一个数组中。然后,该数组被推送到另一个数据库数组中,以跟踪所有提交数组。

我正在尝试构建一个函数来遍历嵌套数组并检查参数 (submissionId) 是否已在嵌套数组中。

当我运行我的代码时,它返回“TypeError:无法读取未定义的属性‘length’。”

在我的代码中,您会看到我在使用 if 语句进行检查之前将一个新的子数组推送到我的父数组。为什么它会返回未定义?确实有一个子数组需要检查其长度。

  // Function to check if submission ID already exists in DB
  function checkDupe(submissionId) {
  
  // Result to track if ID is found or not, view to return the correct view based on result
  let result;
  let view;

  // Push new array for the sake of testing; should always return true in this case
  payrollDb.push(new Array(submissionId));

  // This logs correctly with the submissionId param
  console.log(payrollDb[0][0]);

  // Nested for-loop to iterate through subarray values and check for submissionId
  for(let i=0; i<payrollDb.length; i++) {
    for(let j=0; j<payrollDb[i].length; j++) {
       console.log(submissionId,"\n", payrollDb[i][j]);
      payrollDb[i][j] === submissionId ? result = true : result = false;
    }
    
  };

  // If found, return the error modal, if not continue with the next modal.
  result ? view = views_payroll_duplicate : view = views_payroll_period;

  return view;
  
}

我在这里不知所措。我只想检查 submissionId 是否已存在于我的“数据库”中,如果是,则返回一个 JSON 主体,如果没有找到重复项,则返回另一个 JSON 主体。

任何关于如何修复甚至改进我的建议都将不胜感激!

2个回答

我敢打赌,payrollDb[i] 中的一个是未定义的。在此行之后:

for(let i=0; i<payrollDb.length; i++) {

在下一个循环之前添加一个检查来记录 [i]。然后,当它出错时,导致问题的位置应该会显示出来,您应该能够围绕它进行编码。您还可以将第二个 for 包装在条件中,如果它未定义,则跳过它。

  for(let i=0; i<payrollDb.length; i++) {
      if ([i] === undefined) { // check the type equals undefined
          for(let j=0; j<payrollDb[i].length; j++) {
Clayton Engle
2021-09-03

好吧,看来我找到了问题所在。老实说,我不知道为什么这样做有效,但确实有效。

我在循环之前添加了一个变量,该变量等于我要循环的数组的长度,然后在 for 循环中使用它,而不是直接调用 payrollDb.length 或 payrollDb[i].length。

更新后的代码如下。

function checkDupe(submissionId) {

  let result;
  let view;

  // Set variable for outer array length
  let n = payrollDb.length;
  for(let i=0; i<n; i++) {

    // Set variable for inner array length
    let m = payrollDb[i].length;
    for(let j=0; j<m; j++) {
      payrollDb[i][j] === submissionId ? result = true : result = false;
    }
  };

  result ? view = views_payroll_duplicate : view = views_payroll_period;

  return view;
  
}

如果有人能进一步解释那就太好了!!!

Mike Budgell
2021-09-03