【发布时间】:2022-01-04 13:02:23
【问题描述】:
我写了一些代码来根据txt文件中的数据在js文件中创建对象数组,如下:
var num1 = ['100', '200', '500', '1000']
var num2 = ['10', '20', '30', '40', '50']
for (var i of num1) {
for (var j of num2) {
var source = './dat/txt/data_' + i + '_' + j + '.txt'
var dest = './dat/js/data_' + i + '_' + j + '.js'
var write = '[\n'
fs.readFile(source, 'utf-8', function (err, data) {
if (err) {
console.log(err)
}
var datArray = data.split('\r\n')
for(let k=0;k<parseInt(i);k++){
var numbers = datArray[k].split(' ')
write = write.concat('{\npos:\nx:',numbers[0],',\ny:',numbers[1],'\n},\nbeta:',numbers[2],'\n},')
}
})
fs.writeFile(dest, write, (err) => {
if (err) {
console.log(err)
} else console.log('Written successfully')
})
}
}
txt文件格式如下:
1 2 3
1 2 3
1 2 3
....
我想创建如下对象数组:
[
{
pos: {
x: 1,
y: 2,
},
beta: 3
},
...
]
当我运行代码时,它有这个错误:
var numbers = datArray[k].split(' ')
TypeError: Cannot read properties of undefined (reading 'split')
我尝试记录数组 datArray,它是一个普通的字符串数组,datArray 的长度等于 i 的值。输出文件也只写一个字符'['和一个换行符。 我在这里做错了什么?
【问题讨论】:
-
数组的索引从0开始,所以,你的索引必须小于数组的长度
-
好吧,
console.log(k, datArray, datArray[k])看看你想做什么...... -
顺便说一句,即使修复了这个问题,它也不会起作用,因为您在
readFile甚至完成之前运行writeFile。要么使用同步变体,例如readFileSync,要么了解异步性。 -
另外,因为您在
fors 中使用var而不是let并且readFile调用是异步的,所以所有fors 将在第一个文件完成之前完成甚至阅读,到那时i将具有1000的价值(对于所有这些)。如果您使用let(或者甚至更好,const,因为无论如何您都不会修改i),那么单独的is 将保持其价值。这可能是你的问题。 (要明白我的意思,请尝试for (var i of [1,2,3,4]) setTimeout(() => console.log(i), 100)- 打印4 4 4 4- 与let/const相同 - 打印1 2 3 4。) -
我建议您学习如何在 node.js 中使用调试器,这将更好地向您展示实际运行的顺序和时间,以及变量在每个点的值...
标签: javascript node.js arrays split