Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么foreach循环跳过执行嵌套在其中的foreach代码?_Javascript_Node.js_Node Modules_Fs_Exceljs - Fatal编程技术网

Javascript 为什么foreach循环跳过执行嵌套在其中的foreach代码?

Javascript 为什么foreach循环跳过执行嵌套在其中的foreach代码?,javascript,node.js,node-modules,fs,exceljs,Javascript,Node.js,Node Modules,Fs,Exceljs,我在“images”文件夹中获得了名为这样的图像 100.jpg 200.jpg and on.. 我有一张excel表格,第一(A)列和第二(B)列中都有相应的值 A B 100 101 200 102 and on.. 我试着编写一个小程序来重命名a列中的图像文件,并用B列重命名它 因此,一旦程序运行,我的图像文件夹将有图像命名; 101.jpg 102.jpg 这是我的尝试 var express = require('express'); var path = requir

我在“images”文件夹中获得了名为这样的图像

100.jpg
200.jpg
and on..
我有一张excel表格,第一(A)列和第二(B)列中都有相应的值

A    B
100  101
200  102
and on..
我试着编写一个小程序来重命名a列中的图像文件,并用B列重命名它

因此,一旦程序运行,我的图像文件夹将有图像命名; 101.jpg 102.jpg

这是我的尝试

var express = require('express');
var path = require('path');
var fs = require('fs');
var Excel = require('exceljs');

var app = express();
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(express.static(path.join(__dirname, 'public')));
app.disable('etag');
const testFolder = './images/';
var workbook = new Excel.Workbook(); 
var container;
var unprocfile;
var str;
var renamer;

var runner = 1;
fs.readdir(testFolder, (err, files) => {
  files.slice(1).forEach(file => {
      console.log('Entering foreach of files');
    unprocfile = file;
    str = unprocfile.substr(0, unprocfile.lastIndexOf("."));
    console.log('Name of the file' + str);
    workbook.xlsx.readFile('/Users/Mesam/Documents/renameimages/file.xlsx')
        .then(function() {
            var worksheet = workbook.getWorksheet('Sheet1');
            worksheet.eachRow( function(row, rowNumber) {
             container = row.values;
             // console.log(  typeof container);
             console.log('Entering foreach of Row');
             console.log('Value of 1st column' + row.values[1]);
             if (row.values[1] == str) {
                console.log('If name of file matched value of 1st column' + str + row.values[1]);
              renamer = row.values[2];
              console.log('Renamer var value '+ renamer);
              fs.rename('/Users/Mesam/Documents/renameimages/images/' + file, '/Users/Mesam/Documents/renameimages/images/' + renamer+ '.jpg', function(err, success){
                if (err){console.log(err)};
             });
             }
            });
        });
  })
});
// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};


  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;
这里是调试控制台的输出

Entering foreach of files
app.js:33
Name of the file100
app.js:36
Entering foreach of files
app.js:33
Name of the file200
app.js:36
Entering foreach of Row
app.js:43
Value of 1st column100
app.js:44
Entering foreach of Row
app.js:43
Value of 1st column200
app.js:44
If name of file matched value of 1st column200200
app.js:46
Renamer var value 202
app.js:48
Entering foreach of Row
app.js:43
Value of 1st column300
app.js:44
Entering foreach of Row
app.js:43
Value of 1st column100
app.js:44
Entering foreach of Row
app.js:43
Value of 1st column200
app.js:44
If name of file matched value of 1st column200200
app.js:46
Renamer var value 202
app.js:48
Entering foreach of Row
app.js:43
Value of 1st column300
现在的想法是,对于每个文件,它必须循环遍历它在excel上找到的所有行,比较第一行A列的值(如果匹配),用B列的值重命名文件

但是,调试控制台向我显示,foreach文件执行时没有运行excel的内部foreach。因此,该程序的输出是只有一个图像留在我的文件夹与正确的名称202.jpg

编辑1;有用信息; 我在MAC上工作,所以拼接(1)的原因是跳过
DS\u存储
文件。默认情况下,系统将创建该隐藏文件

console.log(文件)的输出本身就是
100.jpg 200.jp
g,带有
splice(1)

console.log(row.values)
的输出为

[Null, 100, 101]
[Null, 200, 202]

不知道为什么我在那里得到了
Null
,但是代码是以一种忽略它的方式编写的。因此
row.values[1]

请创建一个带有简单数组的小示例&
foreach
来说明您的问题。@palaѕѕѕ添加了更多有关数组外观的有用注释。它之所以“跳过”循环,是因为它实际上是并行读取所有文件,然后并行重命名所有图像。所以你的日志是一团乱麻,看起来像是在跳过东西,但实际上是在做。。只是不是在你期待的时候。我建议您使用最少数量的代码来说明您的问题,这样实际上可以将问题/解决方案显示8/10次。您不必每次都在目录循环中读取
file.xlsx
,在外部读取它并构建一个对象,如
{[oldName]=>[newName]}
。您可以读取目录,执行一个简单的
if(nameMap中的文件名)
然后更改名称。