为什么在JavaScript中使用中间变量来返回数组



在Education.io上,我有一个练习,它的解决方案使用了一个中间变量,我不明白为什么我不能直接这样做。

练习:给定一个数组数组,每个数组都包含一组数字,编写一个函数,返回一个数组,其中每个项是子数组中所有项的总和。例如,

var numbers = [
[1, 2, 3, 4],
[5, 6, 7], 
[8, 9, 10, 11, 12]
];
arraySum(numbers);

将返回以下数组:

[10, 18, 42]

我的解决方案:

var sums = [];
for(i=0; i<numbers.lenght; i++){
for(j=0; j<numbers[i].lenght; j++){
sums[i]= sums[i] + numbers[i][j] ;
}
}
return sums;
}

正确的回答是:

var arraySum = function(numbers) {
var sums = [];
var sum = 0;
var count = 0;
 for (i = 0; i< numbers.length; i++){
for (j = 0; j< numbers[i].length;j++){
      sum = sum + numbers[i][j]}
sums[i] = sum;
sum = 0;
} 
return sums;
}

为什么要使用变量sum在数组中写入sum

我建议采用稍微不同的方法

  • 声明所有变量以及循环的变量
  • 去除不必要/未使用的变量
  • 初始化最内部循环之外的索引处的值
  • 使用该值更新索引处的值

var arraySum = function(numbers) {
const sums = [];
for (let i = 0; i < numbers.length; i++) {
sums[i] = 0;
for (let j = 0; j < numbers[i].length; j++) {
sums[i] += numbers[i][j];
}
}
return sums;
};
console.log(arraySum([[1, 2, 3, 4], [5, 6, 7], [8, 9, 10, 11, 12]]));

为什么使用变量sum来写入数组sum?

理论上,在内部循环中使用该局部变量比每次返回当前值的数组更有效。不过,它不太可能对现实世界的代码产生影响。此外,如果他们要这样做,他们可能也想用numbers[i]来做。

但请注意,您的解决方案有一个拼写错误:lenght而不是length。如果您的解决方案被拒绝,可能是因为这个问题,而不是sum问题。此外,您需要在内部循环主体的顶部使用sum[i] = 0;,因为否则当它没有值时,您将使用sum[i](因此您将获得undefined,这意味着添加将产生NaN(。


但我很抱歉看到";正确的";answer的代码依赖于隐式全局变量的恐怖(它从未声明i(。此外,它使用了不一致的支撑风格(以及糟糕的}——在一个地方的行的末尾,我强烈建议您不要采用(。它也从不将count用于任何用途。如果这真的是";正确答案";他们给出了,你可能会考虑一个不同的教程或课程。

最新更新