在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
用于任何用途。如果这真的是";正确答案";他们给出了,你可能会考虑一个不同的教程或课程。