在Node.js中获取变量的NaN .. Arg?

时间:2011-09-14 23:51:04

标签: node.js

好吧,我有一个家庭作业,我必须阅读文件并计算文件中一串数字之间的距离,然后打印出每组数字的平均值和标准差。 console.log内容的脚本结尾为变量提供了所有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");

1 个答案:

答案 0 :(得分:1)

你在我的脚本中会做很多奇怪的事情 我尽可能地把你作为男人。

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

同样在processLine函数中,您将数字分配给字符串的索引 我认为你认为它是一个阵列,但它不是一回事。 字符串在javascript中是不可变的(无法更改)。

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

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

你的cals阅读文件都做同样的事情。 所以你想要使用相同的功能。 写下来。

您正在分配给lHipJoint数组 processLine函数我的理解是你要添加 计算出的数组值。 您可以使用像这样的推送方法来完成此操作

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

使用异步文件读取时也存在问题 在您阅读文件之前,先打印出结果。 如果你想使用异步的,你需要协调。 您只在完成所有文件读取时打印结果。 但在这种情况下,一个提示是使用非异步的。

我知道这是一项作业,所以你可能不想读我的作品 试图纠正下面的程序。

也许在你递交之后阅读它,但我把它留在这里 对于q&amp;参考其他人阅读此内容。

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");

这个程序可能有一些错误我不知道数据看起来如何,但我希望这会有所帮助 你。