为Node.js中的variables获取NaN .. Arg?

好的,我有一个家庭作业,我必须在文件中读取并计算文件中一串数字之间的距离,然后打印出每组数字的平均值和标准偏差。 脚本的结尾处,console.log内容是给variables的所有NaN。 谁能帮我吗?

*我已经省略了脚本的重复部分,使它更短(它们是更多的数组,而不仅仅是lHipJoint数组和它们的计算,但我把它们排除在外)。

var fs = require('fs'); var lHipJoint = new Array(); //open the first text file fs.readFile('file.txt','utf8', function (err, data) { if (err) throw err; //split the data into an array with each line as an element stuff=data.split('\n'); for (var i = 0; i < stuff.length; i++) { //function that processes each line into an array //with each number as an element and does the euclidean dis. processLine(stuff[i]); } data.length = 0; stuff.length = 0; }); //do the same for the next file fs.readFile('file2.txt','utf8', function (err, data) { if (err) throw err; stuff=data.split('\n'); for (var i = 0; i < stuff.length; i++) { processLine(stuff[i]); } data.length = 0; stuff.length = 0; }); //and again fs.readFile('file3.txt','utf8', function (err, data) { if (err) throw err; stuff=data.split('\n'); for (var i = 0; i < stuff.length; i++) { processLine(stuff[i]); } data.length = 0; stuff.length = 0; }); //and again fs.readFile('file4.txt','utf8', function (err, data) { if (err) throw err; stuff=data.split('\n'); for (var i = 0; i < stuff.length; i++) { processLine(stuff[i]); } data.length = 0; stuff.length = 0; }); //and again fs.readFile('file5.txt','utf8', function (err, data) { if (err) throw err; stuff=data.split('\n'); for (var i = 0; i < stuff.length; i++) { processLine(stuff[i]); } data.length = 0; stuff.length = 0; }); //and again fs.readFile('file6.txt','utf8', function (err, data) { if (err) throw err; stuff=data.split('\n'); for (var i = 0; i < stuff.length; i++) { processLine(stuff[i]); } data.length = 0; stuff.length = 0; }); //function to split each line into an array with each number as an element //then parse the number strings into floats and do the euclidean distances, //storing the values in arrays for each bone. function processLine(line) { var line1 = line var numbers = line1.split(" "); line1.length = 0; for (var i = 0; i < numbers.length; i++) { var number = parseFloat(numbers[i]); line1[i] = number[i]; } lHipJoint = Math.sqrt((line1[6] - line1[9])*(line1[6] - line1[9]) + (line1[7] - line1[10])*(line1[7] - line1[10]) + (line1[8] - line1[11])*(line1[8] - line1[11])); //reset the arrays so they can be reused line1.length = 0; numbers.length = 0; number.length = 0; } //calculations and output for the mean and SD of each bone's distance from the root bone. for(var i = 0; i < lHipJoint.length; i++) { var lHipJointTotal = lHipJointTotal + lHipJoint[i]; } var lHipJointMean = lHipJointTotal/lHipJoint.length; for(var i = 0; i < lHipJoint.length; i++) { var lHipJointSDSum = lHipJointSDSum + (lHipJoint[i] - lHipJointMean)*(lHipJoint[i] - lHipJointMean); } var lHipJointSD = Math.sqrt(lHipJointSDSum/lHipJoint.length); console.log("The mean distance of the left hip joint from the root bone is " +lHipJointMean+ " and the standard deviation is " +lHipJointSD+ ".\n"); 

在你的剧本里,你正在做很多奇怪的事情,我会尝试把upp作为manny。

所以首先不要重置数组。 你在垃圾收集语言只是重新分配新的。

同样在processLine函数中,你正在给一个string的索引分配数字,假设你认为它是一个数组,但它不是一回事。 在javascript中string是不可变的(不能改变)。

在文件底部的循环聚合中,您在每次迭代中声明variables。 你想在这样的循环之前声明它。

 var x = 0; for(var i = 0; i < list.length; i++) { x = x + ...... } 

你的cals读取文件都做同样的事情。 所以你想使用相同的function。 写它的。

你正在分配给processLine函数中的lHipJoint数组,我的理解是你想要将计算值添加到数组中。 你可以用这样的push方法来做到这一点

 lHipJoint.push(Math.sqr(........ 

另外,使用asynchronous文件读取的问题甚至在读取文件之前都会导致打印结果。 如果你想使用asynchronous的,你需要协调,以便。 只有在完成所有文件读取后,才能打印结果。 但提示是在这种情况下使用非asynchronous的。

我知道这是一个任务,所以你可能不想阅读我的尝试来纠正下面的程序。

你递给你之后可能会读它,但是在这里我可以把它留给这里的读者参考。

 var fs = require("fs"); var filePaths = ["file.txt", "file2.txt", "file3.txt", "file4.txt", "file5.txt", "file6.txt"]; var lHipJoint = []; filePaths.forEach(function(path) { var content = fs.readFileSync(path, "utf-8"); var lines = content.split("\n"); lines.forEach(function(line) { if(line.trim() === "") return; var numbers = line.split("\t").map(parseFloat); // im not touching your calculation :D lHipJoint.push(Math.sqrt((numbers[6] - numbers[9])*(numbers[6] - numbers[9]) + (numbers[7] - numbers[10])*(numbers[7] - numbers[10]) + (numbers[8] - numbers[11]) * (numbers[8] - numbers[11]))); }); }); var lHipJointTotal = lHipJoint.reduce(function(p, c) { return p + c; }); var lHipJointMean = lHipJointTotal / lHipJoint.length; var lHipJointSDSum = lHipJoint.reduce(function(p, c) { return p + (c - lHipJointMean) * (c - lHipJointMean); }, 0); var lHipJointSD = Math.sqrt(lHipJointSDSum/lHipJoint.length); console.log("The mean distance of the left hip joint from the root bone is " + lHipJointMean + " and the standard deviation is " + lHipJointSD + ".\n"); 

在这个程序中可能会有一些错误,我不知道数据的外观,但我希望这可以帮助你。