返回值未传递给其他函数

时间:2015-04-23 17:31:20

标签: javascript

我正在尝试通过做一些练习来改进我的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

3 个答案:

答案 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,并且不会担心iend

这是一个小提琴:http://jsfiddle.net/syssqob4/2/

答案 1 :(得分:1)

您的for循环中存在问题。

for(var i = start; i >= end; i += step){
   arr.push(i);
}

这假设step始终为负数,且start始终大于end

您可以对代码进行的最小更改以使其正常工作如下。您没有必要进行类型检查(确保步骤是一个数字),但不要假设用户始终遵循您的假设(我没有进行类型检查),这是一个好习惯。 startend)。例如,你自己并没有遵循步骤为负的假设。

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);   
}