每行填充二维数组
Fill two-dimensional array per row
我有一个返回一维数组的函数(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;
}
}
LP输入.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
这是真正的问题:您在外部作用域中使用了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
循环的条件不再有效,它将退出循环。
给你!
就我而言,我填充了最后 2 个。无论如何,如果你从 0 运行循环,你最好写
A[i] = getCoeff(i+1);
或
您运行该循环从 1 到小于等于 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
相关文章:
- 作为一个二维数组,从ajax接收
- 创建P5.js二维数组
- 如何在Javascript中从select标记的一系列选项中构建二维数组
- inArray,indexOf在二维数组中
- 比较二维数组js
- 从二维数组中获取img src和img维度,并在body中显示
- 如何在Java Script中比较二维数组和一维数组,并将常见数据存储在另一个数组中
- 如何将以下字符串拆分为二维数组:
- 更新Aurelia中二维数组的视图
- 如何在JavaScript中拆分二维数组
- 在二维数组中搜索比嵌套循环更有效的方法
- JavaScript 二维数组填充中的意外输出
- 在JavaScript中用对象填充二维数组时出现问题
- 从jquery中的二维数组填充下拉列表
- 以数字方式填充二维数组
- 使用二维数组填充Javascript表
- Angular 1:使用server's json中的二维数组,用ng-repeat填充表
- Angularjs:如何用$scope中的数据填充二维数组的第二个位置
- 在客户端填充二维数组,并在服务器端获取该数组
- 每行填充二维数组