我正在尝试通过做一些练习来改进我的JavaScript。
我写了一个range
函数,它接受两个参数,start和end,并返回一个包含从start到(和包括)end的所有数字的数组。
然后我编写了一个sum
函数,它接受一组数字并返回这些数字的总和。
问题是当我从range
返回一个值并在第27行(或sum
)传递给console.log(sum(range(1, 10)));
时。但是我的回报值为零。我通过传递数组sum
检查我的test
函数,它按预期工作。我在俯瞰什么?
function range(start, end, step){
if(step === undefined){ step = 1; }
var arr = [];
for(var i = start; i >= end; i += step){
arr.push(i);
}
return arr;
}
function sum(nums){
var total = 0;
for(var i = 0; i < nums.length; i++){
total += nums[i];
}
return total;
}
var test = [1, 3, 5];
console.log(sum(test));
// → returns 9
console.log(range(5, 2, -1));
// → returns [5, 4, 3, 2]
console.log(sum(range(1, 10)));
// → should return 55, but returns 0
答案 0 :(得分:1)
您的range
函数在for循环条件中存在问题。这是我工作的也处理下降范围:
function range(start, end, step){
if(step === undefined){ step = 1; }
var c = (Math.max(start, end) - Math.min(end, start)) / Math.abs(step);
var arr = [];
for(var i = start; c-- >= 0; i += step){
arr.push(i);
}
return arr;
}
它会为要采取的步骤添加一个计数器c
,将其递减直到小于0,并且不会担心i
或end
。
这是一个小提琴:http://jsfiddle.net/syssqob4/2/
答案 1 :(得分:1)
您的for
循环中存在问题。
for(var i = start; i >= end; i += step){
arr.push(i);
}
这假设step
始终为负数,且start
始终大于end
。
您可以对代码进行的最小更改以使其正常工作如下。您没有必要进行类型检查(确保步骤是一个数字),但不要假设用户始终遵循您的假设(我没有进行类型检查),这是一个好习惯。 start
和end
)。例如,你自己并没有遵循步骤为负的假设。
if (isNaN(parseFloat(step))) // This makes sure step is a numeric variable
return arr;
if (step == 0) // This makes sure that the for loop won't be an infinite loop
return arr;
if (step > 0) // This makes sure that step is going to be a negative value
step = -1 * step;
if (start < end) { // This makes sure that start is always greater than end
var tmp = end;
end = start;
start = tmp;
}
for(var i = start; i >= end; i += step){
arr.push(i);
}
答案 2 :(得分:0)
您需要检查以确保开始时间大于结束时间。如果您正在递增,情况总是如此。在进入循环之前,您应该先确保您拥有正确的订单。然后你总是可以从低到高循环。
您还有与步骤相关的竞争概念,而不是开始和结束。步骤应该只采取正整数。如果开始低于结束,您就知道要下台。如果您想让它更强大,那么只需添加:int step = Math.abs(step);
int low;
int high;
if(start < end) {
low = start;
high = end;
}
else {
low = end;
high = start;
}
for(var i = low; i >= high; i += step){
arr.push(i);
}