for循环中的数组......我做错了什么?

时间:2013-06-16 20:02:00

标签: arrays gjs

确定 我的问题 我试图手动将xml解析成一个数组数组(不完全清楚术语) 所以我的代码与此类似

gjs> var f=[],g=[];
for (j=1;j<5;j++){
for(s=1;s<5;s++){g[s]=Math.random()}
f[j]=g;
log(f[j]);
}

结果就是这个

GJS&GT; .... .... .... .... typein:2:严格警告:赋予未声明的变量j typein:3:严格警告:分配给未声明的变量s       JS日志:,0.14567040192803105,0.08676287513204084,0.9227891041751024,0.8698835169518646       JS日志:,0.18009167591958863,0.9074902809032479,0.9244884012106213,0.39937741495685974       JS日志:,0.6942042873840697,0.4262341598548133,0.398151943992746,0.36844997948987923       JS日志:,0.9064724340409265,0.5317808160966455,0.019482062746835505,0.06796944552969397

GJS&GT; F [ 1 ] ,0.9064724340409265,0.5317808160966455,0.019482062746835505,0.06796944552969397 GJS&GT; F [2] ,0.9064724340409265,0.5317808160966455,0.019482062746835505,0.06796944552969397 GJS&GT; F [3] ,0.9064724340409265,0.5317808160966455,0.019482062746835505,0.06796944552969397 GJS&GT; F [4] ,0.9064724340409265,0.5317808160966455,0.019482062746835505,0.06796944552969397

现在问题是f数组在所有元素上都有相同的数组,我真的不知道我在这里做错了什么。 这只是一个例子。但我的代码问题完全相同。我必须做错事但我真的不知道是什么。我在f中的每个元素都有插入f时生成的g数组。我有意义吗?

3 个答案:

答案 0 :(得分:0)

您似乎使用相同的数组 g 。您总是在更改其元素, f 的所有元素都指向相同的 g 数组。

这应该解决它:

var f=[];
for (j=1;j<5;j++){
var g = []
for(s=1;s<5;s++){g[s]=Math.random()}
f[j]=g;
log(f[j]);
}

注意,现在每个 j 迭代都有一个新的 g 声明。

答案 1 :(得分:0)

如果我没错,你必须将f声明为多维数组。

代码必须如下,

gjs> var f=[][],g=[];
for (j=1;j<5;j++){
for(s=1;s<5;s++){g[s]=Math.random()}
f[j]=g;
log(f[j]);
}

答案 2 :(得分:0)

好的,逐步进行并实际解释发生的事情似乎是最好的方法。我看到@Boyko Karadzhov给出了完成任务的答案,但似乎缺乏解释。
首先,假设此代码应该与ES6兼容,如果您不需要变量在全局代码空间中可用,请尝试不要使用varlet绑定到范围,因此在代码顶部的多个位置声明您需要的任何变量都是一种更干净的解决方案,当代码中存在另一个具有相同名称的变量(例如)时,可以避免冲突。 Shell扩展程序。

另一个问题是警告,如果必须在严格模式下运行代码,则使用未声明的变量可能会导致问题。运行此代码是因为它不在严格模式下。如果是这样,它将出错并停止。此警告来自循环变量js,它们没有声明,但是好像已经存在一样使用。

最后但并非最不重要的是,您正在分配资源来创建数组g,只是稍后将其推入f中,而不是将f的值设置为数组,这样分配的资源仅在需要时增加。

// Initialize the variable you'll be populating in the loop
let f = [];

// Set up the loop without causing warnings
// Use a let so the variable only exists within the loop
// Set s to 0 because arrays have a 0-based index. That means the first element will be f[0]
for(let s = 0; s < 4; s++){
    // Rather than using resources to create g, add an array to f immediately
    f[s] = []; // This is the same as your f[s] = g, but values get added later and
               // it doesn't create the extra variable
    // Populate f[s] in another loop
    while(f[s].length < 5){
        // Add a random value to f[s] at a new position
        f[s].push(Math.random());
    }
    // Log the values as you did before.
    log(f[s]);
}

在外部循环中使用for的原因是因为实际需要使用s。因为需要至少检查数组f[s]中有多少个条目。在内部循环中使用索引是完全多余的,因为它的唯一目的是将元素添加到数组的末尾。可以基于对数组length属性的简单布尔检查(而不是计数)来完成此操作。