Javascript 为什么foreach循环跳过执行嵌套在其中的foreach代码?
我在“images”文件夹中获得了名为这样的图像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
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中的文件名)
然后更改名称。