1

好的,我的问题是我试图手动将 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> .... .... .... .... typein:2: 严格警告:赋值给未声明的变量 j typein:3: 严格警告:赋值给未声明的变量 s JS LOG: ,0.14567040192803105,0.08676287513204084, 0.9227891041751024,0.8698835169518646 JS LOG: ,0.18009167591958863,0.9074902809032479,0.9244884012106213,0.39937741495685974 JS LOG: ,0.6942042873840697,0.4262341598548133,0.398151943992746,0.36844997948987923 JS LOG: ,0.9064724340409265,0.5317808160966455,0.019482062746835505,0.06796944552969397

gjs> f[ 1 ] ,0.9064724340409265,0.5317808160966455,0.019482062746835505,0.06796944552969397 gjs> f[2] ,0.9064724340409265,0.5317808160966455,0.019482062746835505,0.06796944552969397 gjs> f[3] ,0.9064724340409265,0.5317808160966455,0.019482062746835505,0.06796944552969397 gjs> f[4] ,0.9064724340409265 ,0.5317808160966455,0.019482062746835505,0.06796944552969397

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

4

3 回答 3

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声明。

于 2013-06-16T20:08:12.443 回答
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]);
}
于 2013-06-16T20:16:02.867 回答
0

好的,一步一步地解释发生了什么似乎是最好的方法。我看到@Boyko Karadzhov 给出了一个完成任务的答案,但似乎缺乏解释。
首先,假设此代码应该与 ES6 兼容,var如果您不需要该变量在全局代码空间中可用,请尽量不要使用。let绑定到范围,因此在代码顶部的多个位置声明您需要的任何变量是一种更简洁的解决方案,它可以防止在代码中存在另一个具有相同名称的变量时发生冲突,例如 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属性的简单布尔检查而不是计数来完成。

于 2019-11-06T12:42:08.397 回答