Sum Array不工作

时间:2017-02-11 04:05:52

标签: javascript arrays

我试图总结一个动态数组。但由于某种原因,这些数字并没有相加,而只是相互显示。我想做1 + 2 + 3 + 4 + 5。但我的输出结果是012345而不是15。

var userInput = -1;
var totalinputs = [];
var sum = 0;
var j = 0;

While(userInput != 999)
{
    userInput = window.prompt("Enter a test score, or 999 to end the program");

    if(userInput <= 100 && userInput >= 0)
    {
        totalInputs[j] = userInput;
        j++;
    }
}

$("lastScore").value = totalInputs[j-1];

for(var i = 0; i < totalInputs.length; i++)
{
    sum += totalInputs[i];
}

$("sumScores").value = sum;

所以当出现提示时,我输入1,2,3,4,5,同时在每个输入之间按Enter键,然后输入999结束提示。输出结果为012345而不是15.我尝试了多个选项但不确定为什么会这样做。 $函数只返回

window.document.getElementById(theId);

3 个答案:

答案 0 :(得分:3)

替换为以下

for(var i = 0; i < totalInputs.length; i++)
{
    sum += +totalInputs[i]; //this coerces string to number.
}
只需编写一个= + a,

a = "1"就可以在javascript中转换为a = 1。这种类型的强制是JS功能。

来自提示框的用户输入是一个字符串。因此,您正面临着这个问题。

答案 1 :(得分:1)

首先,你在那个剧本中有很多拼写错误,而且很难让它发挥作用。

好的,让我们走吧:当你提示某事时,浏览器会将结果存储为字符串。如果将字符串索引0与字符串索引1相加,您将获得两者的串联,而不是总和(如您所期望的那样)。要解决此问题,您可以使用parseInt函数。

var userInput = -1;
var totalInputs = [];
var sum = 0;
var j = 0;

while(userInput != 999)
{
  userInput = window.prompt("Enter a test score, or 999 to end the program");

  if(userInput <= 100 && userInput >= 0)
  {
    totalInputs[j] = userInput;
    j++;
  }
}

$("lastScore").value = totalInputs[j-1];

for(var i = 0; i < totalInputs.length; i++)
{
  sum += parseInt(totalInputs[i]);
}

$("sumScores").value = sum;

这将按预期工作。查看for循环中的语句。 parseInt函数。将字符串转换为Integer,然后求它。

为了使它更好,你可以存储一个Int,而不是在添加总和时强制转换它。所以你想改变这个:

userInput = window.prompt("Enter a test score, or 999 to end the program");

对此:

userInput = parseInt(window.prompt("Enter a test score, or 999 to end the program"));

然后你可以从for循环中删除parseInt。最后:

// sum += parseInt(totalInputs[i]);
sum += totalInputs[i];

答案 2 :(得分:1)

虽然您已将一个标记为答案,但我会尝试抛出自己的版本。上述两个答案仅适用于某些情况。这是为什么错误的修剪?因为你无法信任用户的输入。

@Luis的答案很好,但您是否尝试过输入像1bs64s这样的字母数字?你会发现在解析后它会返回1号。你的用户不希望可能但如果你没关系我认为“我会停在这里”但是在用户的角度来看,它可能很奇怪,因为你允许添加字母数字。

以下是如果你是古玩的原因。

  

如果parseInt遇到的字符不是数字   指定的基数,它忽略它和所有后续字符和   返回解析到该点的整数值。 parseInt截断   数字到整数值。允许前导和尾随空格。

好吧,在您读完之后,您可能会说,这很容易让我只需要将radix基数10来解决问题。不,它没有。由于程序接受0-100范围内的数字@程序员的程序仍然会接受它。

@PBd的答案也有问题,并且遭受上述同样的信念。他只是简单地将字符串强制转换为数字而没有经过适当的验证。

// this condition without properly validation returns true. Allowing `1e1` to store in array.
if("1e1" <= 100 && "1e1" >= 0) // is true!

总结后输出不同(动态打字)。

var sum = 0;
sum += totalInputs[i] // assuming totalInputs[i] returns `1e1`
console.log(sum);     // the output is "01e1".

validation可能有很多版本可以保证您的安全,但IMHO会修剪用户的输入,将字符串强制转换为数字并验证输入是否可以转换为整数。

userInput = window.prompt("Enter a test score, or 999 to end the program").trim(); // or userInput = userInput.trim();

var convertedInput = +userInput;
var isNumber = convertedInput == userInput; // check equality "1" == 1
if(userInput && isNumber && convertedInput >= 0 && convertedInput <= 100)
    totalInputs[j] = convertedInput;

除了简化求和外,还要使用reduce

var sum = totalInputs.reduce(function(pv, cv) { return pv + cv; }, 0);

或在ES6中引入arrow functions,它甚至更简单:

var sum = totalInputs.reduce((pv, cv) => pv+cv, 0);

归功于@ Chaos的answer。我没有检查减少交叉浏览器性能。

Javascript很有趣! :)