需要帮助访问循环之外的数据[undefined] [duplicate]

Need help accessing data outside of a loop[undefined] [duplicate]

提问人:user16201107 提问时间:6/12/2021 最后编辑:user16201107 更新时间:6/12/2021 访问量:282

问:

源是 excel 文件。我解析并遍历了分配标题的列。到目前为止,这工作正常。但是,我似乎无法在 for 循环之外访问此数据,因为它每次都显示为“未定义”。

我正在使用 xls 包,这是在 javascript 中。

由于敏感信息的种类,更改了变量名称以发布代码。如果有什么方法可以更好地澄清,请告诉我。谢谢!

let data = []
for (let fname of fileList) {
        if (file_count > 1) {
            continue
        } else {
        }
        let excelFile = 
        XLSX.readFile(`FILE.xlsm`, 
        {
            cellDates: true,
        });
        log('FILENAME', fname)
        let sheet_name;
        for (let sheet in excelFile.Sheets) {
            sheet_name = sheet
            log('SHEET NAME', sheet)
        }
        let array = XLSX.utils.sheet_to_json(excelFile.Sheets[sheet_name], 
            {
                header: 
                ['HEADER_1', 
                'HEADER_2', 
                'HEADER_3']
            } );
        log('array', array[0].HEADER_1)
     
        for(let i = 0; i<array.length; i++){
            let data = {
                Obj_1: array[i].HEADER_1,
                Obj_2: array[i].HEADER_2,
                Obj_3: [i].HEADER_3
            }
            
        }
    }
JavaScript for 循环

评论

0赞 t.niese 6/12/2021
let data定义一个块作用域变量,该变量在循环外部不存在。那么,为什么您希望可以在循环之外访问它呢?
0赞 user16201107 6/12/2021
道歉!我确实在这里将“let data = []”声明为循环外的空数组: let data = [] for (let fname of fileList) { if (file_count > 1) { continue } else { } let excelFile =
0赞 t.niese 6/12/2021
但你有一个循环。这是一个完全不同的变量(即使它具有相同的名称)。而循环中的那个只存在于循环中。let data let data
0赞 user16201107 6/12/2021
有没有办法使用 .push 也许在外面使用它?
0赞 t.niese 6/12/2021
您的代码不会向 中的数组添加任何内容。此外,在所示代码的情况下,它只不过是一个空数组。在当前来自您的索赔中,与显示的代码相矛盾。创建一个最小的可重现示例,其中代码与您的问题描述相匹配。let data = []undefinedit comes up as "undefined" every time.

答:

0赞 r4pt0s 6/12/2021 #1

在循环中使用 let 定义的变量是块作用域的。 这意味着,您的变量数据只能在 for 循环中访问。

要克服这个问题,你可以做的是,使用你在循环外部定义的数组。

例如

    for(let i = 0; i<array.length; i++){
        
         data.push({
             Obj_1: array[i].HEADER_1,
             Obj_2: array[i].HEADER_2,
             Obj_3: [i].HEADER_3
          });
    }

然后,数据变量将在循环外部访问,它将包含所有其他数据。

您使用的 let 数据不起作用的问题是,您在循环中再次声明了变量数据。

评论

0赞 user16201107 6/12/2021
谢谢!我将其应用于我的代码。不过,这里有两个循环。一个用于文件,另一个用于 excel 中的数据。我不确定我是否应该保留两个循环,或者我是否应该在两个循环之外或只是在第二个循环之外初始化数据。
0赞 user16201107 6/12/2021
忘记标记@r4pt0s
0赞 r4pt0s 6/12/2021
当然,如果你有两个循环,并且需要两个循环来处理数据,那么你应该将 let data=[] 保留在代码中的位置。只需删除循环中的 let 关键字并添加 push 方法即可将数据推送到变量数据中。我会更新我的答案。@user16201107