为什么即使我刚刚推送了一个新数组,嵌套数组的长度仍返回未定义?
我已经在 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 主体。
任何关于如何修复甚至改进我的建议都将不胜感激!
我敢打赌,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++) {
好吧,看来我找到了问题所在。老实说,我不知道为什么这样做有效,但确实有效。
我在循环之前添加了一个变量,该变量等于我要循环的数组的长度,然后在 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;
}
如果有人能进一步解释那就太好了!!!