【问题标题】:Javascript loop error: Uncaught TypeErrorJavascript循环错误:未捕获的TypeError
【发布时间】:2017-01-15 16:44:33
【问题描述】:

我正在练习 Javascript,并且有以下代码在 sets[i][j] = initial_sets [i][j]; 行上返回 Uncaught TypeError: Cannot set property '0' of undefined 错误。这个想法似乎是正确的,但我无法弄清楚为什么我会收到错误。

var sets = [[],[]]; //Declared this 2D array based on solution in https://stackoverflow.com/questions/16512182/how-to-create-empty-2d-array-in-javascript
var initial_sets=[[a,b],[c,d],[e,f]]; //2D array
var i,j;

//2D array sets is being filled by 2D array initial_sets
for (i=0; i<initial_sets.length; i++) {
    for (j=0; j<initial_sets[i].length; j++) {
            sets[i][j] = initial_sets[i][j];
    }
}

我尝试了Uncaught TypeError: Cannot set property '0' of undefined " 中发布的解决方案,方法是创建一个一维数组,然后为其分配另一个维度,但我仍然遇到同样的错误。

【问题讨论】:

  • initial_sets 中有 3 个数组,但 sets 中只有 2 个数组,所以 set[2]undefined
  • initial_sets 虽然是一个二维数组
  • 代码的最终目标是什么?
  • [[],[]];这里数组的大小是 2,所以你怎么能在第三个索引处放置任何东西
  • 基于这个解决方案stackoverflow.com/questions/16512182/…它是一个二维数组的声明。不是只有 2 个索引的数组

标签: javascript arrays multidimensional-array


【解决方案1】:
var sets = [];
var initial_sets=[[a,b],[c,d],[e,f]];
var i,j;

for (i=0; i<initial_sets.length; i++) {
    // check if sets[i] exist. if not push a new emty array to it.
    if(!sets[i]) sets.push([]);
    for (j=0; j<initial_sets[i].length; j++) {
            sets[i][j] = initial_sets[i][j];
    }
}

那么您不必使用空数组初始化sets,它会在需要时推送它们。

【讨论】:

    【解决方案2】:

    数组的维度不相同。

    var sets = []; 
    var initial_sets=[["a","b"],["c","d"],["e","f"]];
    var i,j;
    
    for (i=0; i<initial_sets.length; i++) { 
        var tmp = [];
        for (j=0; j<initial_sets[i].length; j++) {
                tmp[j] = initial_sets[i][j];
        }
        sets[i] = tmp;
    }
    

    var sets = []; 
    var initial_sets=[["a","b"],["c","d"],["e","f"]];
    var i,j;
    
    for (i=0; i<initial_sets.length; i++) { 
        sets[i] = []; 
        for (j=0; j<initial_sets[i].length; j++) {
                sets[i][j] = initial_sets[i][j];
        }    
    }
    

    【讨论】:

    • 是的,它们是……它们都是二维的。而sets 会动态增大到initial_sets 的大小。
    • @user2883071 当i==2sets[i] 未定义。确实是动态增加,但sets[2] 的值是undefined。所以sets[2][j]就是undefined,不能设置
    • 抱歉,我明白你在说什么。我相信当我试图声明一个二维数组时我的困惑出现了。我尝试像这样初始化一个二维数组:var sets = [][];,但这给了我一个错误:Uncaught SyntaxError: Unexpected token ],这就是我使用var sets = [[],[]];的原因
    • 它基于以下解决方案:stackoverflow.com/questions/16512182/…
    • @user2883071 您正确定义了[[], []]。而且您知道使用索引访问数组会导致数组长度增加。但关键是当你想访问sets[i][j]i==2 时,sets[i] 还没有得到重视,而是undefined。因此,在访问 sets[2][j] 之前,您需要为 sets[2] 设置值
    【解决方案3】:

    试试这个:

    var sets = [];
    var initial_sets=[['a','b'],['c','d'],['e','f']];
    var i,j;
    
    for (i=0; i<initial_sets.length; i++){ 
      sets[i]=[];
      for (j=0; j<initial_sets[i].length; j++){
        sets[i].push(initial_sets[i][j]);
      }
    }
    console.log(sets);

    【讨论】:

      猜你喜欢
      • 2022-09-23
      • 2017-02-07
      • 2013-11-07
      • 2019-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-02
      • 1970-01-01
      相关资源
      最近更新 更多