RangeError:一个环境中的数组长度无效,而另一个环境中的数组长度无效

时间:2017-06-01 22:21:51

标签: javascript arrays multidimensional-array

我对Javascript比较陌生,所以我真的很感激有人告诉我发生了什么/为什么

我正在接受coderfight的编码器挑战。我的代码在JS小提琴中工作,但在代码争用失败时出现错误:

"RangeError: Invalid array length
at matrixElementsSum (file.js on line 25:17)
at _runyckrx (file.js on line ?:28)
at getUserOutputs (file.js on line ?:30)
at Object.<anonymous> (file.js on line ?:1)
at Module._compile (module.js:413:34)
at Object.Module._extensions..js (module.js:422:10)
at Module.load (module.js:357:32)
at Function.Module._load (module.js:314:12)
at Function.Module.runMain (module.js:447:10)
at startup (node.js:148:18)"

问题 - 如果数组已堆叠,并且您在特定索引处找到零,则下面的每个数组都将具有相同的索引值也为零

示例:

[[0, 1, 1, 2], 
 [0, 5, 0, 0], 
 [2, 0, 3, 3]]

将是:

[[x, 1, 1, 2], 
 [x, 5, x, x], 
 [x, x, x, x]]

然后找到最终数组中每个值的总和

 matrix =    [[0,1,1,2], 
              [0,5,0,0], 
              [2,0,3,3]]

function matrixElementsSum(matrix) {
      // Calculate the width and height of the Array
      var w = matrix.length || 0;
      var h = matrix[0] instanceof Array ? matrix[0].length : 0;
      // In case it is a zero matrix return empty array.
      if(h === 0 || w === 0) { return []; }

      var i, j, t = [];
      // Loop through every item in the outer array (height)
      for(i=0; i<h; i++) {
        // Insert a new row (array)
        t[i] = [];
        // Loop through every item per item in outer array (width)
        for(j=0; j<w; j++) {
          // Save transposed martix.
          t[i][j] = matrix[j][i];
        }
      }
     // rows are now cols - if we come across a 0 the remaining values 
    //dont need to be there
      for(var i = 0; i < t.length; i++){
        t[i].length = t[i].indexOf(0);
      }

     //concat multi array to single array
    var merged = [].concat.apply([], t);

    // get sum of flattened array
    var totalCost = merged.reduce(function(acc, val) {
      return acc + val;
    }, 0);  
    return totalCost
    }

matrixElementsSum(matrix)

1 个答案:

答案 0 :(得分:0)

问题很可能在这里:

  for(var i = 0; i < t.length; i++){
    t[i].length = t[i].indexOf(0);
  }

如果t[i]不包含0,则indexOf()将返回-1。数组长度必须至少为0,您不能将其设置为-1。添加一个支票:

for (var i = 0; i < t.length; i++) {
    var index = t[i].indexOf(0);
    if (index != -1) {
        t[i].length = index;
    }
}

您在jsfiddle中没有看到问题,因为您的matrix在每列中都有0t数组只是matrix的转置) 。当您将程序提交给CoderFight时,他们可能会使用不同的矩阵对其进行测试,包括某些列中没有零的矩阵。然后遇到bug。它与环境无关,只与输入数据有关。