【问题标题】:Need help accessing data outside of a loop[undefined] [duplicate]需要帮助访问循环外的数据[未定义] [重复]
【发布时间】:2026-02-15 04:55:02
【问题描述】:

来源是一个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
            }
            
        }
    }

【问题讨论】:

  • let data 定义了一个块范围变量,它不存在于循环之外。那么为什么你期望你可以在循环之外访问它呢?
  • 抱歉!我确实在这里将“let data = []”声明为循环之外的空数组:let data = [] for (let fname of fileList) { if (file_count > 1) { continue } else { } let excelFile =跨度>
  • 但是你在循环中有一个let data 。这是一个完全不同的变量(即使它具有相同的名称)。而循环中的let data 只存在于循环内。
  • 有没有办法可以使用 .push 在外面使用它?
  • 您的代码不会向let data = [] 中的数组添加任何内容。此外,在所示代码的情况下,它不是undefined,而是一个空数组。在您的声明中,it comes up as "undefined" every time. 与显示的代码相矛盾。创建一个minimal reproducible example,其中代码与您的问题描述相匹配。

标签: javascript for-loop


【解决方案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 数据不起作用的问题是,因为您在循环中再次声明了变量 data。

【讨论】:

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