【问题标题】:Fill two-dimensional array per row每行填充二维数组
【发布时间】:2014-04-30 11:32:34
【问题描述】:

我有一个返回一维数组的函数 (getCoeff())。我尝试用它来填充一个二维数组:

//set up an 3x3 array for A
A = new Array(3);
for (var i=0; i<3; i++) {
    A[i] = new Array(3);
}

//fill it per row using getCoeff()
for (var i=0; i<3; i++) {
        A[i] = getCoeff(i+1);
}

console.log(A);
console.log(getCoeff(1));
console.log(getCoeff(2));
console.log(getCoeff(3));

但我只填满了第一行,而其他两个保持为空:

[ [ -3, 2, -1 ], [ , ,  ], [ , ,  ] ]
[ -3, 2, -1 ]
[ 2, -3, 2 ]
[ 1, -1, 3 ]

如您所见,该函数正确返回行,但由于某种原因,它在循环内不起作用。

另一方面,如果我尝试这样的事情:

for (var i=0; i<3; i++) {
        A[i] = [1,2,3];
}
console.log(A);

效果很好!

[ [ 1, 2, 3 ], [ 1, 2, 3 ], [ 1, 2, 3 ] ]

我的代码有什么问题?!

更新:

我在编辑之前的原始完整代码:

    var fs = require('fs');
    var input = "LPinput.txt";
    var c = new Array();
    var A = new Array();
    var b = new Array();
    var Eqin = new Array();
    var MinMax;

    open(input);

    console.log(c);
    console.log(A);
    console.log(b);
    console.log(Eqin);
    console.log(MinMax);

    function open(filename) {
        if (fs.existsSync(filename)) {
           var data = fs.readFileSync(filename).toString().split("\n");
           analyse(data);
        } else {
           console.log("ERROR: File doesnt exist!");
        }
    }

    function analyse(data) {

        //clean up whitespaces
        for (i in data) {
            data[i] = data[i].replace(/\s/g, '');       
        }   

        //check LP type & clean up
        if (data[0].substring(0,3) == "max") {
            MinMax = 1;
            data[0] = data[0].replace("max","");
        } else if (data[0].substring(0,3) == "min") {
            MinMax = -1;
            data[0] = data[0].replace("min","");
        } else {
            console.log("ERROR: Invalid format!");
            return;
        }

        //check constraints format & clean up
        if ( data[1].substring(0,4) != "s.t.") {
            console.log("ERROR: Invalid format!");
            return;
        } else {
            data[1] = data[1].replace("s.t.","");
        }

        //get variables 
        var variables = data[data.length-1].split(",");
        var last = variables[variables.length-1];
        variables[variables.length-1] = last.substring(0,last.indexOf(">"));

        //get number of constraints
        var constraints = data.length-2;

        c = getCoeff(0);

            //===============================
            //I JUST NEED TO POPULATE A TO FINISH THIS
        for (var i=0; i<constraints; i++) {
            A[i] = getCoeff(i+1);
        }   
            //===============================

        for (var i=1; i<data.length-1; i++) {
            var end = data[i].length;
            var start = end;
            while (data[i].charAt(start) != "=") {
                 start = start - 1;
            }
            b[i-1] = parseInt(data[i].substring(start+1,end));

            if (data[i].charAt(start-1) == "<") {
                Eqin[i-1]=-1;
            } else if (data[i].charAt(start-1) == ">") {
                Eqin[i-1]=1;
            } else {
                Eqin[i-1]=0;
            }

        }

        function getCoeff(row) {
            var coeff = new Array();
            for (i in variables) {
                var pos = data[row].indexOf(variables[i]);
                if ((data[row].charAt(pos-1) == "+") || (pos-1 < 0)) {
                    coeff[i]=1;
                } else if (data[row].charAt(pos-1) == "-") {
                    coeff[i]=-1;
                } else if (data[row].charAt(pos-1) == "*") {
                    var end = pos-1;
                    var start = end;
                    while ( (start > -1) && (data[row].charAt(start) != "+") && (data[row].charAt(start) != "-") ) {
                        start = start - 1;
                    }
                    coeff[i] = parseInt((data[row].substring(start,end)));
                }
            }
            return coeff;
        }

    }

LPinput.txt:

max 2*x1+x2-4*x3-15
s.t.-3*x1+2*x2-x3>=5
    2*x1-3*x2+2*x3<=9
    x1-x2+3*x3<=5
    x1,x2,x3>=0

更新 #2:

控制台输出:

[ 2, 1, -4 ]
[ [ -3, 2, -1 ] ]
[ 5, 9, 5 ]
[ 1, -1, -1 ]
1

它应该是:

[ 2, 1, -4 ]
[ [ -3, 2, -1 ],[ 2, -3, 2 ],[ 1, -1, 3 ]]
[ 5, 9, 5 ]
[ 1, -1, -1 ]
1

【问题讨论】:

  • 因为您的函数 getCoeff() 中有问题,所以您没有向我们展示。
  • variables 的值是从哪里提升的?这似乎是您问题的全部根源 - variables 来自函数范围之外,它决定了结果数组中的项目数。
  • new Array(3) 创建一个包含 3 个未定义元素的数组。它不限制数组的大小,您可以访问元素 3,4,5,...,它们将被创建。
  • 另一方面,它也可能是data 中的值,它们也来自外部来源,并且是决定最终数组 getCoeff() 中的内容的关键部分返回。如果不看到这些值,就无法真正帮助您进行调试。
  • 我看不到任何其他方式,伙计们。我会在几分钟内复制完整的代码。这让我抓狂。-

标签: javascript arrays for-loop rows


【解决方案1】:

这是真正的问题: 您在外部作用域中使用了 i 变量。

    for (var i=0; i<constraints; i++) {
        A[i] = getCoeff(i+1);
    }   

当你进入 getCoef 时,你就有了这个 for 循环

for (i in variables) {

并且由于您没有在这里声明i,它使用在外部范围中声明的相同i。第一次运行 for 循环后(填充 A 的第一行),i 更改为 "0",而不是数值 0。因此,for 循环的条件不再有效,它退出循环。

你去!

【讨论】:

  • OMFG!我是如此接近放弃它!非常感谢@Hesam!我至少被困了 3 个小时....天哪!
  • 欢迎您!这些小东西,这些小东西搞砸了代码!小心和欢呼
【解决方案2】:

在我的情况下,我填充了最后 2 个。无论如何,如果你从 0 开始运行循环,你最好写

A[i] = getCoeff(i+1);

或

您从 1 到小于等于 3 运行该循环。

【讨论】:

    【解决方案3】:

    在您的代码中:

    A = new Array(3);
    

    您应该声明变量,并且通常不需要初始化具有长度的数组。此外,按照惯例,以大写字母开头的变量是为构造函数保留的(尽管有些变量名全部大写以表示常量)。

    考虑使用数组初始化器:

    var a = [];   
    for (var i=0; i<3; i++) {
    

    在以下循环中初始化数组有点没用,因为您在下一个循环中替换它们:

        a[i] = [];
    }
    

    在下一个循环中,i 被不必要地再次声明(javascript 中没有块范围)。在这些情况下使用不同的变量是很常见的(尽管重复使用 i 没有不良影响,只是不受欢迎):

    for (var j=0; j<3; j++) {
            a[j] = getCoeff(j + 1);
    }
    

    所以创建一个 getCoeff 函数,它只返回一个传递给它的值的数组(纯粹用于测试):

    function getCoeff(v){
      return [v,v,v]; 
    } 
    

    “作品”:

    console.log(a.join(' - ')); // 1,1,1 - 2,2,2 - 3,3,3
    

    【讨论】:

    • 抱歉,尝试了所有组合和语法。我只是无法解决这个问题。请尝试通过复制完整代码并在Node.js上执行脚本来重现它
    猜你喜欢
    • 2016-05-27
    • 1970-01-01
    • 2015-01-24
    • 2019-01-18
    • 1970-01-01
    • 2014-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多