我对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)
答案 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
在每列中都有0
(t
数组只是matrix
的转置) 。当您将程序提交给CoderFight时,他们可能会使用不同的矩阵对其进行测试,包括某些列中没有零的矩阵。然后遇到bug。它与环境无关,只与输入数据有关。